diff options
372 files changed, 39453 insertions, 15386 deletions
diff --git a/.travis.yml b/.travis.yml index 352d736e4..a2ccb3a64 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,23 +1,11 @@ language: cpp -# BEGIN BUILD MATRIX -# -# Build matrix must be smaller on branch coverity_scan because quota allows -# only 5 Coverity Scan jobs at once. Thus we have different versions of this -# file on branch master and coverity_scan. -# -# Please keep this file as much in sync as possible to allow easy merging -# from master into coverity_scan and only have differences in the build -# matrix block. -# -# Check the difference as follows: -# $ git checkout master -# $ git checkout coverity_scan -# $ git difftool master coverity_scan .travis.yml os: - linux - osx +dist: trusty +sudo: required osx_image: xcode7 compiler: @@ -25,72 +13,74 @@ compiler: - gcc env: + global: + - CCACHE_SIZE=50M + - CCACHE_COMPRESS=1 + - BUILD_JOBS=2 + # SONAR_TOKEN for accessing the SonarQube server + - secure: "VezRbHFg6kllV5WG06M3tG3aHJaC3xrMylJ6RCVbL+uz2JeralVCqV7eIk4fVb9cu83Li+weEa0AJj0wkxpIUJ+vUh5F65L6gSWSbgHP7muOSVsmnEc6KvX4n3av/ZGe4geSmsxqh2pd/2xI1h7KioGRhKeqaZIdjVgWgGJW2iQ=" + # GITHUB_TOKEN for posting found issues as comments in the PR that's beeing analyzed by SonarQube + - secure: "Th0mBSkUCDqu+EA6F7zA6DCSDZBNunfndANyq06BwaFlj71daWWjthwYFsfg3T5N2ZmI+PsULQQpOirCnJt1lbNHhMVJwZPkW0JnjoxbSNpSI2+nHv7+GO9X9WjK0LRFawiQu8WxmLMQDA+0oR0BERSFKc3gmbuav9fDfla0dXg=" + matrix: - - TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="shared" - - TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="static" - - TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="coverage" - - TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="sanitizer" - - TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="shared" - - TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="static" - - TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="coverage" - - TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="sanitizer" - - - TARGETOS="native" MODULES="min" BOOST="n" BUILD_MODE="shared" - - TARGETOS="native" MODULES="min" BOOST="n" BUILD_MODE="static" - - TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="shared" - - TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="static" - - - TARGETOS="ios32" MODULES="all" BOOST="n" BUILD_MODE="static" - - TARGETOS="ios64" MODULES="all" BOOST="n" BUILD_MODE="static" + - BUILD_MODE="shared" + - BUILD_MODE="static" + - BUILD_MODE="mini-shared" + - BUILD_MODE="mini-static" + - BUILD_MODE="cross-arm32" + - BUILD_MODE="cross-arm64" + - BUILD_MODE="cross-ppc32" + - BUILD_MODE="cross-ppc64" + - BUILD_MODE="cross-win32" + - BUILD_MODE="coverage" + - BUILD_MODE="sanitizer" + - BUILD_MODE="valgrind" + - BUILD_MODE="sonarqube" matrix: - exclude: - - os: osx - compiler: gcc - - # No boost on Linux because installing Boost is easier on OS X - - os: linux - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="shared" + # Ignore some problem builds for now + allow_failures: - os: linux - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="static" + env: BUILD_MODE="cross-ppc32" - os: linux - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="coverage" + env: BUILD_MODE="cross-ppc64" - os: linux - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="sanitizer" - - os: linux - env: TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="shared" - - os: linux - env: TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="static" + env: BUILD_MODE="cross-win32" + + exclude: + # Skip GCC on OS X entirely + - os: osx + compiler: gcc - # No coverage and sanitizer on clang + # Run coverage, valgrind, sonarqube, sanitizer, minimized and + # non-ARM cross builds on Linux/gcc only. The sanitizer builds + # under Clang run the tests very slowly and cause CI timeouts. - compiler: clang - env: TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="coverage" + env: BUILD_MODE="coverage" - compiler: clang - env: TARGETOS="native" MODULES="all" BOOST="n" BUILD_MODE="sanitizer" + env: BUILD_MODE="sonarqube" - compiler: clang - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="coverage" + env: BUILD_MODE="sanitizer" - compiler: clang - env: TARGETOS="native" MODULES="all" BOOST="y" BUILD_MODE="sanitizer" - - # No minimal builds on clang + env: BUILD_MODE="valgrind" + - compiler: clang + env: BUILD_MODE="mini-shared" - compiler: clang - env: TARGETOS="native" MODULES="min" BOOST="n" BUILD_MODE="shared" + env: BUILD_MODE="mini-static" - compiler: clang - env: TARGETOS="native" MODULES="min" BOOST="n" BUILD_MODE="static" + env: BUILD_MODE="cross-win32" - compiler: clang - env: TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="shared" + env: BUILD_MODE="cross-ppc32" - compiler: clang - env: TARGETOS="native" MODULES="min" BOOST="y" BUILD_MODE="static" + env: BUILD_MODE="cross-ppc64" + # No ARM Clang compiler on Linux - os: linux - env: TARGETOS="ios32" MODULES="all" BOOST="n" BUILD_MODE="static" + compiler: clang + env: BUILD_MODE="cross-arm32" - os: linux - env: TARGETOS="ios64" MODULES="all" BOOST="n" BUILD_MODE="static" -# END BUILD MATRIX - -cache: - directories: - - $HOME/.ccache + compiler: clang + env: BUILD_MODE="cross-arm64" install: - ./src/scripts/ci/travis/install.sh @@ -104,20 +94,16 @@ after_success: notifications: email: [email protected] +git: + depth: 5 + +cache: + ccache: true + directories: + - $HOME/.sonar/cache + addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - ccache - - g++-4.8 - - libssl-dev - - libsqlite3-dev - - zlib1g-dev - - libbz2-dev - - liblzma-dev - - python2 - - python3 + sonarqube: true coverity_scan: project: @@ -126,3 +112,4 @@ addons: build_command_prepend: "./configure.py --cc-bin=/usr/bin/g++-4.8" build_command: "make -j2" branch_pattern: coverity_scan + diff --git a/botan_version.py b/botan_version.py index e5e2b811a..c737e21a0 100644 --- a/botan_version.py +++ b/botan_version.py @@ -1,7 +1,7 @@ release_major = 1 release_minor = 11 -release_patch = 30 +release_patch = 31 release_so_abi_rev = release_patch # These are set by the distribution script diff --git a/circle.yml b/circle.yml index 48688eb60..125fd0fcb 100644 --- a/circle.yml +++ b/circle.yml @@ -1,14 +1,8 @@ dependencies: pre: - - sudo add-apt-repository -y 'deb http://llvm.org/apt/precise/ llvm-toolchain-precise-3.6 main' - - sudo add-apt-repository -y ppa:ubuntu-toolchain-r/test - - wget -q -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add - - sudo apt-get update -qq - override: - - sudo apt-get install g++-4.9 clang-3.6 + - sudo apt-get install clang post: - - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.9 99 - - sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 99 - g++ --version - clang++ --version diff --git a/configure.py b/configure.py index aeff794a8..82f30cd47 100755 --- a/configure.py +++ b/configure.py @@ -4,7 +4,7 @@ Configuration program for botan (C) 2009,2010,2011,2012,2013,2014,2015 Jack Lloyd -(C) 2015 Simon Warta (Kullo GmbH) +(C) 2015,2016 Simon Warta (Kullo GmbH) Botan is released under the Simplified BSD License (see license.txt) @@ -29,7 +29,6 @@ import shutil import string import subprocess import logging -import getpass import time import errno import optparse @@ -123,10 +122,12 @@ class BuildConfigurationInformation(object): 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.modules = modules self.sources = sorted(flatten([mod.sources() for mod in modules])) 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.via_amalgamation: self.build_sources = ['botan_all.cpp'] @@ -180,6 +181,7 @@ class BuildConfigurationInformation(object): yield self.testobj_dir yield self.botan_include_dir yield self.internal_include_dir + yield self.external_include_dir yield os.path.join(self.doc_output_dir, 'manual') if options.with_doxygen: @@ -198,14 +200,6 @@ class BuildConfigurationInformation(object): def pkg_config_file(self): return 'botan-%d.%d.pc' % (self.version_major, self.version_minor) - def username(self): - return getpass.getuser() - - def hostname(self): - return platform.node() - - def timestamp(self): - return time.ctime() """ Handle command line options @@ -308,6 +302,9 @@ def process_command_line(args): 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') + link_methods = ['symlink', 'hardlink', 'copy'] build_group.add_option('--link-method', default=None, metavar='METHOD', choices=link_methods, @@ -381,7 +378,7 @@ def process_command_line(args): help='minimize build') # Should be derived from info.txt but this runs too early - third_party = ['boost', 'bzip2', 'lzma', 'openssl', 'sqlite3', 'zlib', 'tpm'] + third_party = ['boost', 'bzip2', 'lzma', 'openssl', 'sqlite3', 'zlib', 'tpm', 'pkcs11'] for mod in third_party: mods_group.add_option('--with-%s' % (mod), @@ -458,6 +455,9 @@ def process_command_line(args): options.no_optimizations = True options.with_debug_info = True + if options.with_coverage: + options.no_optimizations = True + def parse_multiple_enable(modules): if modules is None: return [] @@ -569,14 +569,14 @@ class ModuleInfo(object): def __init__(self, infofile): lex_me_harder(infofile, self, - ['source', 'header:internal', 'header:public', - 'requires', 'os', 'arch', 'cc', 'libs', - 'frameworks', 'comment', 'warning'], + ['source', 'header:internal', 'header:public', + 'header:external', 'requires', 'os', 'arch', + 'cc', 'libs', 'frameworks', 'comment', + 'warning'], { 'load_on': 'auto', 'define': [], - 'need_isa': '', - 'mp_bits': 0 }) + 'need_isa': ''}) def extract_files_matching(basedir, suffixes): for (dirpath, dirnames, filenames) in os.walk(basedir): @@ -633,12 +633,11 @@ class ModuleInfo(object): self.source = [add_dir_name(s) for s in self.source] self.header_internal = [add_dir_name(s) for s in self.header_internal] self.header_public = [add_dir_name(s) for s in self.header_public] + self.header_external = [add_dir_name(s) for s in self.header_external] - for src in self.source + self.header_internal + self.header_public: + for src in self.source + self.header_internal + self.header_public + self.header_external: if os.access(src, os.R_OK) == False: - logging.warning("Missing file %s in %s" % (src, infofile)) - - self.mp_bits = int(self.mp_bits) + logging.error("Missing file %s in %s" % (src, infofile)) if self.comment != []: self.comment = ' '.join(self.comment) @@ -650,10 +649,14 @@ class ModuleInfo(object): else: self.warning = None - intersection = set(self.header_public) & set(self.header_internal) + def intersect_check(typeA, listA, typeB, listB): + intersection = set.intersection(set(listA), set(listB)) + if len(intersection) > 0: + logging.error('Headers %s marked both %s and %s' % (' '.join(intersection), typeA, typeB)) - if len(intersection) > 0: - logging.warning('Headers %s marked both public and internal' % (' '.join(intersection))) + 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) def sources(self): return self.source @@ -664,6 +667,9 @@ class ModuleInfo(object): def internal_headers(self): return self.header_internal + def external_headers(self): + return self.header_external + def defines(self): return ['HAS_' + d[0] + ' ' + d[1] for d in chunks(self.define, 2)] @@ -958,8 +964,8 @@ class CompilerInfo(object): if s in self.so_link_commands: return self.so_link_commands[s] - raise Exception("No shared library link command found for target '%s' in compiler settings '%s'. Searched for: %s" % - (osname, self.infofile, ", ".join(search_for))) + raise Exception("No shared library link command found for target '%s' in compiler settings '%s'" % + (osname, self.infofile)) """ Return the command needed to link an app/test object @@ -969,8 +975,7 @@ class CompilerInfo(object): if s in self.binary_link_commands: return self.binary_link_commands[s] - raise Exception("No binary link command found for target '%s' in compiler settings '%s'. Searched for: %s" % - (osname, self.infofile, ", ".join(search_for))) + return '$(LINKER)' """ Return defines for build.h @@ -1121,11 +1126,11 @@ def gen_makefile_lists(var, build_config, options, modules, cc, arch, osinfo): def isa_specific_flags(cc, src): def simd_dependencies(): - simd_re = re.compile('simd_(.*)') - for mod in modules: - if simd_re.match(mod.basename): - for isa in mod.need_isa: - yield isa + if 'sse2' in arch.isa_extensions: + return ['sse2'] + elif 'altivec' in arch.isa_extensions: + return ['altivec'] + return [] for mod in modules: if src in mod.sources(): @@ -1177,18 +1182,19 @@ def gen_makefile_lists(var, build_config, options, modules, cc, arch, osinfo): Form snippets of makefile for building each source file """ def build_commands(sources, obj_dir, flags): + includes = cc.add_include_dir_option + build_config.include_dir + includes+= ' ' + cc.add_include_dir_option + build_config.external_include_dir if build_config.external_headers else '' + includes+= ' ' + cc.add_include_dir_option + options.with_external_includedir if options.with_external_includedir else '' for (obj_file,src) in zip(objectfile_list(sources, obj_dir), sources): - yield '%s: %s\n\t$(CXX)%s $(%s_FLAGS) %s%s %s %s %s$@\n' % ( + yield '%s: %s\n\t$(CXX)%s $(%s_FLAGS) %s %s %s %s$@\n' % ( obj_file, src, isa_specific_flags(cc, src), flags, - cc.add_include_dir_option, - build_config.include_dir, + includes, cc.compile_flags, src, cc.output_to_option) - for t in ['lib', 'cli', 'test']: obj_key = '%s_objs' % (t) src_list, src_dir = build_config.src_info(t) @@ -1230,19 +1236,9 @@ def create_template_vars(build_config, options, modules, cc, arch, osinfo): return sorted(libs) def choose_mp_bits(): - mp_bits = [mod.mp_bits for mod in modules if mod.mp_bits != 0] - - if mp_bits == []: - logging.debug('Using arch default MP bits %d' % (arch.wordsize)) - return arch.wordsize - - # Check that settings are consistent across modules - for mp_bit in mp_bits[1:]: - if mp_bit != mp_bits[0]: - raise Exception('Incompatible mp_bits settings found') - - logging.debug('Using MP bits %d' % (mp_bits[0])) - return mp_bits[0] + mp_bits = arch.wordsize # allow command line override? + logging.debug('Using MP bits %d' % (mp_bits)) + return mp_bits def prefix_with_build_dir(path): if options.with_build_dir != None: @@ -1277,9 +1273,6 @@ def create_template_vars(build_config, options, modules, cc, arch, osinfo): 'src_dir': build_config.src_dir, 'doc_dir': build_config.doc_dir, - 'timestamp': build_config.timestamp(), - 'user': build_config.username(), - 'hostname': build_config.hostname(), 'command_line': ' '.join(sys.argv), 'local_config': slurp_file(options.local_config), 'makefile_style': options.makefile_style or cc.makefile_style, @@ -1332,10 +1325,6 @@ def create_template_vars(build_config, options, modules, cc, arch, osinfo): 'shared_flags': cc.gen_shared_flags(options), 'visibility_attribute': cc.gen_visibility_attribute(options), - # 'botan' or 'botan-1.11'. Used in Makefile and install script - # This can be made constistent over all platforms in the future - 'libname': 'botan' if options.os == 'windows' else 'botan-%d.%d' % (build_config.version_major, build_config.version_minor), - 'lib_link_cmd': cc.so_link_command_for(osinfo.basename, options), 'cli_link_cmd': cc.binary_link_command_for(osinfo.basename, options), 'test_link_cmd': cc.binary_link_command_for(osinfo.basename, options), @@ -1400,6 +1389,15 @@ def create_template_vars(build_config, options, modules, cc, arch, osinfo): vars['botan_pkgconfig'] = prefix_with_build_dir(os.path.join(build_config.build_dir, build_config.pkg_config_file())) + # 'botan' or 'botan-1.11'. Used in Makefile and install script + # This can be made consistent over all platforms in the future + vars['libname'] = 'botan-%d.%d' % (build_config.version_major, build_config.version_minor) + else: + if options.with_debug_info: + vars['libname'] = 'botand' + else: + vars['libname'] = 'botan' + vars["header_in"] = process_template('src/build-data/makefile/header.in', vars) if vars["makefile_style"] == "gmake": @@ -1541,8 +1539,6 @@ def choose_modules_to_use(modules, module_policy, archinfo, ccinfo, options): reason, ' '.join(disabled_mods))) for mod in sorted(to_load): - if mod.startswith('mp_'): - logging.info('Using MP module ' + mod) if mod.startswith('simd_') and mod != 'simd_engine': logging.info('Using SIMD module ' + mod) @@ -1654,8 +1650,11 @@ def generate_amalgamation(build_config, options): self.file_contents = {} for f in sorted(input_list): - contents = strip_header_goop(f, open(f).readlines()) - self.file_contents[os.path.basename(f)] = contents + try: + contents = strip_header_goop(f, open(f).readlines()) + self.file_contents[os.path.basename(f)] = contents + except Exception as e: + logging.error('Error processing file %s for amalgamation: %s' % (f, e)) self.contents = '' for name in sorted(self.file_contents): @@ -1842,7 +1841,7 @@ def main(argv = None): logging.getLogger().setLevel(log_level()) - logging.debug('%s invoked with options "%s"' % ( + logging.info('%s invoked with options "%s"' % ( argv[0], ' '.join(argv[1:]))) logging.info('Platform: OS="%s" machine="%s" proc="%s"' % ( @@ -1920,9 +1919,17 @@ def main(argv = None): options.compiler = 'gcc' else: options.compiler = 'msvc' - elif options.os == 'darwin': + elif options.os == 'darwin' or options.os == 'freebsd': 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)' % ( @@ -2082,6 +2089,9 @@ def main(argv = None): link_headers(build_config.internal_headers, 'internal', build_config.internal_include_dir) + link_headers(build_config.external_headers, 'external', + build_config.external_include_dir) + with open(os.path.join(build_config.build_dir, 'build_config.py'), 'w') as f: f.write(str(template_vars)) diff --git a/doc/contributing.rst b/doc/contributing.rst index a0b8daec1..64b609af5 100644 --- a/doc/contributing.rst +++ b/doc/contributing.rst @@ -38,7 +38,6 @@ Library Layout * ``entropy`` has various entropy sources * ``asn1`` is the DER encoder/decoder * ``cert/x509`` is X.509 certificates, PKCS #10 requests, OCSP -* ``cert/cvc`` is Card Verifiable Certificates (ePassport credentials) * ``tls`` contains the TLS implementation * ``filters`` is a filter/pipe API for data transforms * ``compression`` has the compression wrappers (zlib, bzip2, lzma) @@ -113,9 +112,11 @@ 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. +(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 @@ -137,6 +138,21 @@ 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. + External Dependencies ======================================== diff --git a/doc/credits.rst b/doc/credits.rst index 6d62b6380..290067491 100644 --- a/doc/credits.rst +++ b/doc/credits.rst @@ -15,6 +15,13 @@ snail-mail address (S), and Bitcoin address (B). D: documentation editing S: Oregon, USA + N: Simon Cogliani + E: [email protected] + 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 D: GF(p) arithmetic @@ -60,6 +67,13 @@ snail-mail address (S), and Bitcoin address (B). D: Locking in Algo_Registry for Windows OS S: Slovenia + N: René Korthaus + E: [email protected] + 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 D: Curve25519 @@ -104,3 +118,15 @@ snail-mail address (S), and Bitcoin address (B). W: https://www.kullo.net D: Build system S: Germany + + N: Philipp Weber + E: [email protected] + W: https://sirrix.com/ + D: KDF1-18033, ECIES + S: Saarland, Germany + + N: Daniel Neus + E: [email protected] + W: https://sirrix.com/ + D: CI, PKCS#11, RdSeed, BSI module policy + S: Bochum, Germany diff --git a/doc/deprecated.txt b/doc/deprecated.txt new file mode 100644 index 000000000..d62954d1d --- /dev/null +++ b/doc/deprecated.txt @@ -0,0 +1,34 @@ +Currently deprecated: + +- PRNGs X9.31 (no longer approved) and HMAC_RNG (non-standard) + Use HMAC_DRBG + +- ECB mode for block ciphers + +- Rabin-Williams signatures + +- Nyberg-Rueppel signatures + +- MARS, RC2, RC5, RC6, SAFER, TEA + +- ECB Cipher_Mode + +- MD2, HAS-160, RIPEMD-128 + +- 3DES and SEED ciphersuites in TLS + +- DSA auth in TLS (not ECDSA) + +- 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 + +- All support for BeOS/Haiku including BeOS entropy source + +- EGD entropy source + +- Unix process exec entropy source diff --git a/doc/license.txt b/doc/license.txt index f292a0d59..88b16651c 100644 --- a/doc/license.txt +++ b/doc/license.txt @@ -29,6 +29,8 @@ Copyright (C) 1999-2013,2014,2015,2016 Jack Lloyd 2015,2016 Daniel Neus 2015 Uri Blumenthal 2015,2016 Kai Michaelis + 2016 Simon Cogliani + 2015,2016 Rohde & Schwarz Cybersecurity 2016 Juraj Somorovsky 2016 Christian Mainka All rights reserved. diff --git a/doc/manual/rng.rst b/doc/manual/rng.rst index 300570c3a..7eb229a5e 100644 --- a/doc/manual/rng.rst +++ b/doc/manual/rng.rst @@ -3,108 +3,77 @@ Random Number Generators ======================================== -The random number generators provided in Botan are meant for creating -keys, IVs, padding, nonces, and anything else that requires 'random' -data. It is important to remember that the output of these classes -will vary, even if they are supplied with the same seed (ie, two -``Randpool`` objects with similar initial states will not produce the -same output, because the value of high resolution timers is added to -the state at various points). - -To create a random number generator, instantiate a ``AutoSeeded_RNG`` -object. This object will handle choosing the right algorithms from the -set of enabled ones and doing seeding using OS specific -routines. The main service a RandomNumberGenerator provides is, of -course, random numbers: +The base class ``RandomNumberGenerator`` is in the header ``botan/rng.h``. -.. cpp:function:: byte RandomNumberGenerator::next_byte() +The major interfaces are + +.. cpp:function:: void RandomNumberGenerator::randomize(byte* output_array, size_t length) - Generates a single random byte and returns it + Places *length* random bytes into the provided buffer. -.. cpp:function:: void RandomNumberGenerator::randomize(byte* data, size_t length) +.. cpp:function:: void RandomNumberGenerator::add_entropy(const byte* data, size_t length) - Places *length* bytes into the array pointed to by *data* + 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. -To ensure good quality output, a PRNG needs to be seeded with truly -random data. Normally this is done for you. However it may happen that -your application has access to data that is potentially unpredictable -to an attacker. If so, use +.. cpp:function:: void RandomNumberGenerator::randomize_with_input(byte* data, size_t length, \ + const byte* ad, size_t ad_len) -.. cpp:function:: void RandomNumberGenerator::add_entropy(const byte* data, \ - size_t length) + 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. -which incorporates the data into the current randomness state. Don't -worry about filtering the data or doing any kind of cryptographic -preprocessing (such as hashing); the RNG objects in botan are designed -such that you can feed them any arbitrary non-random or even -maliciously chosen data - as long as at some point some of the seed -data was good the output will be secure. +.. cpp:function:: byte 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. -Implementation Notes +RNG Types ---------------------------------------- -Randpool -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +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 can be instantiated with any hash function but is +typically used with SHA-256, SHA-384, or SHA-512. -``Randpool`` is the primary PRNG within Botan. In recent versions all -uses of it have been wrapped by an implementation of the X9.31 PRNG -(see below). If for some reason you should have cause to create a PRNG -instead of using the "global" one owned by the library, it would be -wise to consider the same on the grounds of general caution; while -``Randpool`` is designed with known attacks and PRNG weaknesses in -mind, it is not an standard/official PRNG. The remainder of this -section is a (fairly technical, though high-level) description of the -algorithms used in this PRNG. Unless you have a specific interest in -this subject, the rest of this section might prove somewhat -uninteresting. - -``Randpool`` has an internal state called pool, which is 512 bytes -long. This is where entropy is mixed into and extracted from. There is also a -small output buffer (called buffer), which holds the data which has already -been generated but has just not been output yet. - -It is based around a MAC and a block cipher (which are currently -HMAC(SHA-256) and AES-256). Where a specific size is mentioned, it -should be taken as a multiple of the cipher's block size. For example, -if a 256-bit block cipher were used instead of AES, all the sizes -internally would double. Every time some new output is needed, we -compute the MAC of a counter and a high resolution timer. The -resulting MAC is XORed into the output buffer (wrapping as needed), -and the output buffer is then encrypted with AES, producing 16 bytes -of output. - -After 8 blocks (or 128 bytes) have been produced, we mix the pool. To -do this, we first rekey both the MAC and the cipher; the new MAC key -is the MAC of the current pool under the old MAC key, while the new -cipher key is the MAC of the current pool under the just-chosen MAC -key. We then encrypt the entire pool in CBC mode, using the current -(unused) output buffer as the IV. We then generate a new output -buffer, using the mechanism described in the previous paragraph. - -To add randomness to the PRNG, we compute the MAC of the input and XOR -the output into the start of the pool. Then we remix the pool and -produce a new output buffer. The initial MAC operation should make it -very hard for chosen inputs to harm the security of ``Randpool``, and -as HMAC should be able to hold roughly 256 bits of state, it is -unlikely that we are wasting much input entropy (or, if we are, it -doesn't matter, because we have a very abundant supply). +HMAC DRBG seems to be the most conservative generator of the NIST +approved options. + +System_RNG +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In ``system_rng.h``, objects of ``System_RNG`` reference a single +(process global) reference to the system PRNG (/dev/urandom or +CryptGenRandom). + +AutoSeeded_RNG +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +This instantiates a new instance of a userspace PRNG, seeds it with +a default entropy pool. ANSI X9.31 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +This generator is deprecated and will be removed in a future release. + ``ANSI_X931_PRNG`` is the standard issue X9.31 Appendix A.2.4 PRNG, though using AES-256 instead of 3DES as the block cipher. This PRNG implementation has been checked against official X9.31 test vectors. -Internally, the PRNG holds a pointer to another PRNG (typically -Randpool). This internal PRNG generates the key and seed used by the -X9.31 algorithm, as well as the date/time vectors. Each time an X9.31 -PRNG object receives entropy, it passes it along to the PRNG it is -holding, and then pulls out some random bits to generate a new key and -seed. This PRNG considers itself seeded as soon as the internal PRNG -is seeded. - +Internally, the PRNG holds a pointer to another RNG object. This +internal PRNG generates the key and seed used by the X9.31 algorithm, +as well as the date/time vectors. Each time an X9.31 PRNG object +receives entropy, it passes it along to the PRNG it is holding, and +then pulls out some random bits to generate a new key and seed. This +PRNG considers itself seeded as soon as the internal PRNG is seeded. Entropy Sources --------------------------------- diff --git a/doc/manual/srp.rst b/doc/manual/srp.rst index e3aace5ff..74b67d890 100644 --- a/doc/manual/srp.rst +++ b/doc/manual/srp.rst @@ -10,7 +10,7 @@ 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, in which - .. warning:: +.. warning:: While knowledge of the verifier does not easily allow an attacker to get the raw password, they could still use the verifier to diff --git a/doc/manual/tls.rst b/doc/manual/tls.rst index a10a4280c..6c1ca42f2 100644 --- a/doc/manual/tls.rst +++ b/doc/manual/tls.rst @@ -22,44 +22,62 @@ 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 a 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 +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, etc. +message queue, lwIP on RTOS, some carrier pidgeons, etc. -The callbacks for TLS have the signatures +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 output_fn(const byte data[], size_t data_len) + .. cpp:function:: void tls_emit_data(const byte data[], size_t data_len) - TLS requests that all bytes of *data* be queued up to send to the - counterparty. After this function returns, *data* will be - overwritten, so a copy of the input must be made if the callback + 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. - .. cpp:function:: void data_cb(const byte data[], size_t data_len) + 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 byte 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. - Called whenever application data is received from the other side - of the connection, in which case *data* and *data_len* specify - the data received. This array will be overwritten sometime after - the callback returns, so again a copy should be made if need be. + For TLS the record number will always increase. - .. cpp:function:: void alert_cb(Alert alert, const byte data[], size_t data_len) + For DTLS, it is possible to receive records with the `rec_no` field + field out of order or repeated. It is even possible (from a malicious or + faulty peer) to receive multiple copies of a single record with differing plaintexts. - Called when an alert is received. Normally, data is null and - data_len is 0, as most alerts have no associated data. However, - if TLS heartbeats (see :rfc:`6520`) were negotiated, and we - initiated a heartbeat, then if/when the other party responds, - ``alert_cb`` will be called with whatever data was included in - the heartbeat response (if any) along with a psuedo-alert value - of ``HEARTBEAT_PAYLOAD``. + .. cpp:function:: void tls_alert(Alert alert) - .. cpp:function:: bool handshake_cb(const TLS::Session& session) + 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) - Called whenever a negotiation completes. This can happen more - than once on any connection. The *session* parameter provides - information about the session which was established. + 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. @@ -68,8 +86,29 @@ The callbacks for TLS have the signatures exception which will send a close message to the counterparty and reset the connection state. -You can of course use tools like ``std::bind`` to bind additional -parameters to your callback functions. + .. cpp:function:: std::string tls_server_choose_app_protocol(const std::vector<std::string>& 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_debug(const char*) + + This callback is for exerimental purposes and currently unused. It may be + removed or modified in a future release. + +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 ---------------------------------------- @@ -80,16 +119,6 @@ available: .. cpp:class:: TLS::Channel - .. cpp:type:: std::function<void (const byte[], size_t)> output_fn - - .. cpp:type:: std::function<void (const byte[], size_t)> data_cb - - .. cpp:type:: std::function<void (Alert, const byte[], size_t)> alert_cb - - .. cpp:type:: std::function<bool (const Session&)> handshake_cb - - Typedefs used in the code for the functions described above - .. cpp:function:: size_t received_data(const byte buf[], size_t buf_size) .. cpp:function:: size_t received_data(const std::vector<byte>& buf) @@ -194,10 +223,7 @@ TLS Clients .. cpp:class:: TLS::Client .. cpp:function:: Client( \ - output_fn out, \ - data_cb app_data_cb, \ - alert_cb alert_cb, \ - handshake_cb hs_cb, \ + Callbacks& callbacks, Session_Manager& session_manager, \ Credentials_Manager& creds, \ const Policy& policy, \ @@ -211,29 +237,8 @@ TLS Clients Initialize a new TLS client. The constructor will immediately initiate a new session. - The *output_fn* callback will be called with output that - should be sent to the counterparty. For instance this will be - called immediately from the constructor after the client hello - message is constructed. An implementation of *output_fn* is - allowed to defer the write (for instance if writing when the - callback occurs would block), but should eventually write the data - to the counterparty *in order*. - - The *data_cb* will be called with data sent by the counterparty - after it has been processed. The byte array and size_t represent - the plaintext value and size. - - The *alert_cb* will be called when a protocol alert is received, - commonly with a close alert during connection teardown. - - The *handshake_cb* function is called when a handshake - (either initial or renegotiation) is completed. The return value of - the callback specifies if the session should be cached for later - resumption. If the function for some reason desires to prevent the - connection from completing, it should throw an exception - (preferably a TLS::Exception, which can provide more specific alert - information to the counterparty). The :cpp:class:`TLS::Session` - provides information about the session that was just established. + 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. @@ -285,34 +290,30 @@ TLS Servers .. cpp:class:: TLS::Server .. cpp:function:: Server( \ - output_fn output, \ - data_cb data_cb, \ - alert_cb alert_cb, \ - handshake_cb handshake_cb, \ + Callbacks& callbacks, 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 = 16*1024 \ ) -The first 8 arguments as well as the final argument +The first 5 arguments as well as the final argument *reserved_io_buffer_size*, are treated similiarly to the :ref:`client <tls_client>`. -The (optional) argument, *proto_chooser*, is a function called if the -client sent the ALPN extension to negotiate an application -protocol. In that case, the function should choose a protocol to use -and return it. Alternately it can throw an exception to abort the -exchange; the ALPN specification says that if this occurs the alert -should be of type `NO_APPLICATION_PROTOCOL`. +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 hello without this parameter. +would not until they actually received a client hello. Code for a TLS server using asio is in `src/cli/tls_proxy.cpp`. @@ -516,7 +517,7 @@ policy settings from a file. Values without an explicit mode use old-style CBC with HMAC encryption. Default value: "AES-256/GCM", "AES-128/GCM", "ChaCha20Poly1305", - "AES-256/CCM", "AES-128/CCM", "AES-256/CCM-8", "AES-128/CCM-8", + "AES-256/CCM", "AES-128/CCM", "AES-256/CCM(8)", "AES-128/CCM(8)", "AES-256", "AES-128" Also allowed: "Camellia-256/GCM", "Camellia-128/GCM", @@ -529,15 +530,18 @@ policy settings from a file. .. note:: - The current ChaCha20Poly1305 ciphersuites are non-standard but - as of 2015 were implemented and deployed by Google and - elsewhere. Support will be changed to using IETF standard - ChaCha20Poly1305 ciphersuites when those are defined. + 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<std::string> allowed_macs() const Returns the list of algorithms we are willing to use for @@ -577,6 +581,10 @@ policy settings from a file. Also allowed (disabled by default): "" (meaning anonymous) + .. note:: + + DSA authentication is deprecated and will be removed in a future release. + .. cpp:function:: std::vector<std::string> allowed_ecc_curves() const Return a list of ECC curves we are willing to use, in order of preference. diff --git a/doc/news.rst b/doc/news.rst index 2a9fe53a6..711f982a8 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,7 +1,128 @@ Release Notes ======================================== -Version 1.11.30, Not Yet Released +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) + +* 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 @@ -9,16 +130,48 @@ Version 1.11.30, Not Yet Released 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 the Compressor_tkk. The Cipher_Mode interface remains unchanged + 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 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 @@ -37,13 +190,21 @@ Version 1.11.30, Not Yet Released * X509_CRL previously had an option to cause it to ignore unknown critical extensions. This has been removed. - -* Added support for ChaCha stream cipher with 12 rounds. + +* 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. @@ -56,6 +217,17 @@ Version 1.11.30, Not Yet Released * 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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -179,6 +351,19 @@ Version 1.11.29, 2016-03-20 * Support for locking allocator on Windows using VirtualLock. GH #450 +Version 1.18.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 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/doc/security.rst b/doc/security.rst index 23b46f30d..6223943e0 100644 --- a/doc/security.rst +++ b/doc/security.rst @@ -19,6 +19,24 @@ Advisories 2016 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* 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 diff --git a/doc/todo.rst b/doc/todo.rst index d57c319b7..f4720f3ba 100644 --- a/doc/todo.rst +++ b/doc/todo.rst @@ -7,6 +7,14 @@ 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. +Documentation +---------------------------------------- + +* TPM (no docs) +* PKCS #11 (no docs) +* X.509 certs, path validation +* Specific docs covering one major topic (RSA, ECDSA, AES/GCM, ...) + CLI ---------------------------------------- @@ -14,7 +22,6 @@ CLI for an example * `encrypt` / `decrypt` tools providing password and/or public key based file encryption -* `bcrypt` cmdlet * Make help output more helpful * More microbenchmarks in `speed`: modular exponentiation, ECC point multiplication, other BigInt operations @@ -27,6 +34,7 @@ TLS * Make TLS v1.0 and v1.1 optional at build time * Make finite field DH optional at build time * Curve25519 key exchange +* NEWHOPE (CECPQ1) key exchange (GH #613) * TLS OCSP stapling (RFC 6066) * Encrypt-then-MAC extension (RFC 7366) * Authentication using TOFU (sqlite3 storage) @@ -40,6 +48,7 @@ TLS PKIX ---------------------------------------- +* Test suite for validation of 'real world' cert chains (GH #611) * Support multiple DNS names in certificates * X.509 policy constraints * OCSP responder logic diff --git a/readme.rst b/readme.rst index 0fe50df7c..35f58d159 100644 --- a/readme.rst +++ b/readme.rst @@ -72,6 +72,9 @@ operations. .. image:: https://codecov.io/github/randombit/botan/coverage.svg?branch=master :target: https://codecov.io/github/randombit/botan +.. image:: https://sonarqube.com/api/badges/gate?key=botan + :target: https://sonarqube.com/dashboard/index/botan + Download ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -97,9 +100,9 @@ Versions 1.11 and later require a working C++11 compiler; GCC 4.8 and later, Clang 3.4 and later, and MSVC 2013 are regularly tested. The latest development release is -`1.11.29 <http://botan.randombit.net/releases/Botan-1.11.29.tgz>`_ -`(sig) <http://botan.randombit.net/releases/Botan-1.11.29.tgz.asc>`_ -released on 2016-03-20 +`1.11.31 <http://botan.randombit.net/releases/Botan-1.11.31.tgz>`_ +`(sig) <http://botan.randombit.net/releases/Botan-1.11.31.tgz.asc>`_ +released on 2016-08-30 Old Stable Series (1.10) ---------------------------------------- diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 000000000..408210b81 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,21 @@ +# must be unique in a given SonarQube instance +sonar.projectKey=botan + +# this is the name displayed in the SonarQube UI +sonar.projectName=Botan +sonar.projectVersion=1.0 + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +# Since SonarQube 4.2, this property is optional if sonar.modules is set. +# If not set, SonarQube starts looking for source code from the directory containing +# the sonar-project.properties file. +sonar.sources=src + +# Language, needed for SonarQube < 4.2 +sonar.language=cpp + +# The build-wrapper output dir +sonar.cfamily.build-wrapper-output=bw-outputs + +# Encoding of the source code. Default is default system encoding +sonar.sourceEncoding=UTF-8 diff --git a/src/build-data/buildh.in b/src/build-data/buildh.in index d6201be19..e943973a0 100644 --- a/src/build-data/buildh.in +++ b/src/build-data/buildh.in @@ -2,8 +2,8 @@ #define BOTAN_BUILD_CONFIG_H__ /* -* This file was automatically generated %{timestamp} UTC by -* %{user}@%{hostname} running '%{command_line}' +* This file was automatically generated running +* '%{command_line}' * * Target * - Compiler: %{cxx} %{cxx_abi_flags} %{cc_compile_flags} @@ -98,14 +98,20 @@ #define BOTAN_PRIVATE_KEY_STRONG_CHECKS_ON_GENERATE 1 /* -* RNGs will automatically poll the system for additional seed material -* after producing this many bytes of output. +* 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_MAX_OUTPUT_BEFORE_RESEED 4096 -#define BOTAN_RNG_RESEED_POLL_BITS 128 +#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) +/** +* Controls how AutoSeeded_RNG is instantiated +*/ +#define BOTAN_AUTO_RNG_DRBG HMAC_DRBG +#define BOTAN_AUTO_RNG_HMAC "HMAC(SHA-384)" + /* * Specifies (in order) the list of entropy sources that will be used * to seed an in-memory RNG. The first few in the default list @@ -140,41 +146,12 @@ #define BOTAN_ENTROPY_SAFE_PATHS { "/bin", "/sbin", "/usr/bin", "/usr/sbin" } /* -* Defines the static entropy estimates which each type of source uses. -* These values are expressed as the bits of entropy per byte of -* output (in double format) and should be conservative. These are used -* unless an entropy source has some more specific opinion on the entropy -* of the underlying source. -*/ - -// We include some high resolution timestamps because it can't hurt -#define BOTAN_ENTROPY_ESTIMATE_TIMESTAMPS 0 - -// Data which is system or process specific, but otherwise static -#define BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA 0 - -// Binary system data of some kind -#define BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA 0.5 - -// Human readable text which has entropy -#define BOTAN_ENTROPY_ESTIMATE_SYSTEM_TEXT (1.0 / 64) - -/* -The output of a hardware RNG such as RDRAND / RDSEED - -By default such RNGs are used but not trusted, so that the standard -softare-based entropy polling is still used. -*/ -#define BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG 0.0 - -/* -How often should the RdRand/RdSeed RNGs be polled - -Each poll generates 32 bit entropy +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 +// According to Intel, RDRAND is guaranteed to generate a random number within 10 retries on a working CPU #define BOTAN_ENTROPY_RDRAND_RETRIES 10 /* @@ -183,10 +160,6 @@ Each poll generates 32 bit entropy */ #define BOTAN_ENTROPY_RDSEED_RETRIES 20 -// The output of a PRNG we are trusting to be strong -#define BOTAN_ENTROPY_ESTIMATE_STRONG_RNG 7.0 - - /* * Compiler and target specific flags */ @@ -297,4 +270,20 @@ Each poll generates 32 bit entropy // The struct is only declared to force the semicolon, it is never defined. #define BOTAN_FORCE_SEMICOLON struct BOTAN_DUMMY_STRUCT +#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 + #endif diff --git a/src/build-data/cc/clang.txt b/src/build-data/cc/clang.txt index 2585190c4..8c5baf7ca 100644 --- a/src/build-data/cc/clang.txt +++ b/src/build-data/cc/clang.txt @@ -11,12 +11,13 @@ add_framework_option "-framework " lang_flags "-std=c++11 -D_REENTRANT -fstack-protector" warning_flags "-Wall -Wextra -Wpedantic -Wshadow -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wunreachable-code" -maintainer_warning_flags "-Qunused-arguments -Werror -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=unreachable-code" +maintainer_warning_flags "-Qunused-arguments -Werror -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=unreachable-code -Wno-error=deprecated-declarations" compile_flags "-c" debug_info_flags "-g" optimization_flags "-O3" -sanitizer_flags "-fsanitize=address,undefined -fsanitize-coverage=edge,indirect-calls,8bit-counters -fno-sanitize-recover=undefined" +#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" @@ -40,6 +41,8 @@ darwin -> "$(LINKER) -headerpad_max_install_names" darwin-debug -> "$(LINKER) -headerpad_max_install_names" linux -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" linux-debug -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" +freebsd -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" +freebsd-debug -> "$(LINKER) -Wl,-rpath=\$$ORIGIN" default -> "$(LINKER)" default-debug -> "$(LINKER)" </binary_link_commands> @@ -59,6 +62,7 @@ altivec -> "-maltivec" </isa_flags> <mach_opt> +x86_32 -> "-march=SUBMODEL" x86_64 -> "-march=SUBMODEL" nehalem -> "-march=corei7" sandybridge -> "-march=corei7-avx" @@ -68,8 +72,10 @@ ivybridge -> "-march=core-avx-i" <mach_abi_linking> all -> "-pthread" +x86_32 -> "-m32" x86_64 -> "-m64" ppc64 -> "-m64" +darwin -> "-stdlib=libc++" netbsd -> "-D_NETBSD_SOURCE" </mach_abi_linking> diff --git a/src/build-data/cc/gcc.txt b/src/build-data/cc/gcc.txt index 0687a6dd0..7d795d4e1 100644 --- a/src/build-data/cc/gcc.txt +++ b/src/build-data/cc/gcc.txt @@ -8,8 +8,11 @@ add_lib_dir_option -L add_lib_option -l lang_flags "-std=c++11 -D_REENTRANT" -maintainer_warning_flags "-Wold-style-cast -Werror -Wno-error=old-style-cast -Wno-error=zero-as-null-pointer-constant -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=strict-overflow -Wsuggest-override" -warning_flags "-Wall -Wextra -Wpedantic -Wshadow -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wzero-as-null-pointer-constant -Wnon-virtual-dtor" + +# This should only contain flags which are included in GCC 4.8 +warning_flags "-Wall -Wextra -Wpedantic -Wstrict-aliasing -Wstrict-overflow=5 -Wcast-align -Wmissing-declarations -Wpointer-arith -Wcast-qual -Wzero-as-null-pointer-constant -Wnon-virtual-dtor" + +maintainer_warning_flags "-Wold-style-cast -Wsuggest-override -Wshadow -Werror -Wno-error=old-style-cast -Wno-error=zero-as-null-pointer-constant -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=strict-overflow -Wno-error=deprecated-declarations" compile_flags "-c" debug_info_flags "-g" diff --git a/src/build-data/makefile/gmake.in b/src/build-data/makefile/gmake.in index d68db271c..60ff6d58d 100644 --- a/src/build-data/makefile/gmake.in +++ b/src/build-data/makefile/gmake.in @@ -58,7 +58,7 @@ clean: -$(RM) %{libobj_dir}/* -$(RM) %{testobj_dir}/* -$(RM) %{cliobj_dir}/* - -$(RM) $(SONAME) $(SYMLINK) + -$(RM) $(SONAME_ABI) $(SONAME_BASE) -$(RM) $(LIBRARIES) $(CLI) $(TEST) distclean: clean diff --git a/src/build-data/makefile/nmake.in b/src/build-data/makefile/nmake.in index 119e91849..4075ccbbf 100644 --- a/src/build-data/makefile/nmake.in +++ b/src/build-data/makefile/nmake.in @@ -14,7 +14,7 @@ RM_R = $(RM) /S RMDIR = @rmdir # Executable targets -CLI = %{out_dir}\botan%{program_suffix} +CLI = %{out_dir}\botan-cli%{program_suffix} TEST = %{out_dir}\botan-test%{program_suffix} # Library targets diff --git a/src/build-data/os/freebsd.txt b/src/build-data/os/freebsd.txt index dfe3d2edf..9d6ed3614 100644 --- a/src/build-data/os/freebsd.txt +++ b/src/build-data/os/freebsd.txt @@ -1,5 +1,9 @@ os_type unix +soname_pattern_base "libbotan-{version_major}.{version_minor}.so" +soname_pattern_abi "libbotan-{version_major}.{version_minor}.so.{abi_rev}" +soname_pattern_patch "libbotan-{version_major}.{version_minor}.so.{abi_rev}.{version_patch}" + <target_features> clock_gettime gettimeofday diff --git a/src/build-data/policy/bsi.txt b/src/build-data/policy/bsi.txt index b8d47a5fd..048f63892 100644 --- a/src/build-data/policy/bsi.txt +++ b/src/build-data/policy/bsi.txt @@ -19,6 +19,11 @@ keccak cmac hmac +# kdf +kdf1_iso18033 +sp800_108 +sp800_56c + # pk_pad eme_oaep emsa_pssr @@ -31,11 +36,12 @@ rsa dsa ecdsa ecgdsa +ecies +eckcdsa ecdh # rng auto_rng -hmac_rng hmac_drbg </required> @@ -52,14 +58,16 @@ beos_stats cryptoapi_rng darwin_secrandom dev_random -egd hres_timer proc_walk rdrand rdseed -system_rng win32_stats +# rng +rdrand_rng +system_rng + # utils locking_allocator simd_altivec @@ -111,6 +119,11 @@ ofb rc4 salsa20 +# kdf +kdf1 +kdf2 +prf_x942 + # pubkey curve25519 elgamal @@ -118,6 +131,7 @@ gost_3410 mce mceies nr +rfc6979 rw # pk_pad @@ -152,6 +166,9 @@ x919_mac # rng x931_rng + +# entropy sources +egd unix_procs </prohibited> diff --git a/src/build-data/policy/sane.txt b/src/build-data/policy/modern.txt index f75242266..a98ec5077 100644 --- a/src/build-data/policy/sane.txt +++ b/src/build-data/policy/modern.txt @@ -22,28 +22,59 @@ poly1305 siphash pbkdf2 +bcrypt +compression # required for private key encryption pbes2 -# required for TLS -prf_tls - curve25519 ecdh ecdsa rsa +rfc6979 eme_oaep emsa_pssr emsa1 auto_rng -hmac_rng +hmac_drbg ffi </required> +<if_available> +tls +prf_tls + +clmul +locking_allocator + +aes_ni +aes_ssse3 +serpent_simd +threefish_avx2 + +simd_scalar +simd_sse2 +simd_altivec + +rdrand_rng +system_rng + +# entropy sources +beos_stats +cryptoapi_rng +darwin_secrandom +dev_random +hres_timer +proc_walk +rdrand +rdseed +win32_stats +</if_available> + <prohibited> cast des @@ -91,32 +122,9 @@ x931_rng passhash9 cryptobox + +# questionable entropy sources +egd unix_procs </prohibited> -<if_available> -clmul -locking_allocator - -aes_ni -aes_ssse3 -serpent_simd -threefish_avx2 - -simd_scalar -simd_sse2 -simd_altivec - -# entropy sources -beos_stats -cryptoapi_rng -darwin_secrandom -dev_random -egd -hres_timer -proc_walk -rdrand -rdseed -system_rng -win32_stats -</if_available> diff --git a/src/build-data/sphinx/conf.py b/src/build-data/sphinx/conf.py index f506b461a..ff927c8bd 100644 --- a/src/build-data/sphinx/conf.py +++ b/src/build-data/sphinx/conf.py @@ -32,11 +32,11 @@ templates_path = ['templates'] if is_website_build and use_disqus: templates_path += ['disqus'] -files_dir = 'http://botan.randombit.net/releases' +files_dir = 'https://botan.randombit.net/releases' extlinks = { 'wikipedia': ('https://en.wikipedia.org/wiki/%s', ''), - 'botan-devel': ('http://lists.randombit.net/pipermail/botan-devel/%s.html', None), + 'botan-devel': ('https://lists.randombit.net/pipermail/botan-devel/%s.html', None), 'cve': ('https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-%s', 'CVE-'), @@ -177,7 +177,7 @@ html_show_copyright = False # contain a <link> 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 = 'http://botan.randombit.net/' + html_use_opensearch = 'https://botan.randombit.net/' else: html_use_opensearch = '' diff --git a/src/cli/cli.h b/src/cli/cli.h index 11cc8add7..7e2d49f0f 100644 --- a/src/cli/cli.h +++ b/src/cli/cli.h @@ -10,7 +10,10 @@ #include <botan/build.h> #include <botan/parsing.h> #include <botan/rng.h> -#include <botan/auto_rng.h> + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif #if defined(BOTAN_HAS_SYSTEM_RNG) #include <botan/system_rng.h> @@ -471,7 +474,9 @@ class Command if(rng_type == "auto") { +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) m_rng.reset(new Botan::AutoSeeded_RNG); +#endif } if(!m_rng) diff --git a/src/cli/credentials.h b/src/cli/credentials.h index 11bfd3de1..95bbd5aa4 100644 --- a/src/cli/credentials.h +++ b/src/cli/credentials.h @@ -62,7 +62,7 @@ class Basic_Credentials_Manager : public Botan::Credentials_Manager try { // TODO: make path configurable - const std::vector<std::string> paths = { "/usr/share/ca-certificates" }; + const std::vector<std::string> paths = { "/etc/ssl/certs", "/usr/share/ca-certificates" }; for(auto&& path : paths) { diff --git a/src/cli/speed.cpp b/src/cli/speed.cpp index 595b4bd20..222a98d3f 100644 --- a/src/cli/speed.cpp +++ b/src/cli/speed.cpp @@ -6,6 +6,8 @@ */ #include "cli.h" +#include "../tests/test_rng.h" // FIXME + #include <sstream> #include <iomanip> #include <chrono> @@ -17,9 +19,12 @@ #include <botan/hash.h> #include <botan/mac.h> #include <botan/cipher_mode.h> -#include <botan/auto_rng.h> #include <botan/entropy_src.h> +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif + #if defined(BOTAN_HAS_SYSTEM_RNG) #include <botan/system_rng.h> #endif @@ -36,6 +41,10 @@ #include <botan/x931_rng.h> #endif +#if defined(BOTAN_HAS_FPE_FE1) + #include <botan/fpe_fe1.h> +#endif + #if defined(BOTAN_HAS_COMPRESSION) #include <botan/compression.h> #endif @@ -398,10 +407,19 @@ class Speed final : public Command bench_inverse_mod(msec); } #endif + +#if defined(BOTAN_HAS_FPE_FE1) + else if(algo == "fpe_fe1") + { + bench_fpe_fe1(msec); + } +#endif else if(algo == "RNG") { +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) Botan::AutoSeeded_RNG auto_rng; bench_rng(auto_rng, "AutoSeeded_RNG (periodic reseed)", msec, buf_size); +#endif #if defined(BOTAN_HAS_SYSTEM_RNG) bench_rng(Botan::system_rng(), "System_RNG", msec, buf_size); @@ -415,12 +433,15 @@ class Speed final : public Command #if defined(BOTAN_HAS_HMAC_DRBG) for(std::string hash : { "SHA-256", "SHA-384", "SHA-512" }) { - - auto hmac = Botan::MessageAuthenticationCode::create("HMAC(" + hash + ")"); - Botan::HMAC_DRBG hmac_drbg(hmac->clone()); + Botan::HMAC_DRBG hmac_drbg(hash); bench_rng(hmac_drbg, hmac_drbg.name(), msec, buf_size); + } +#endif - Botan::HMAC_RNG hmac_rng(hmac->clone(), hmac->clone()); +#if defined(BOTAN_HAS_HMAC_RNG) + for(std::string hash : { "SHA-256", "SHA-384", "SHA-512" }) + { + Botan::HMAC_RNG hmac_rng(Botan::MessageAuthenticationCode::create("HMAC(" + hash + ")")); bench_rng(hmac_rng, hmac_rng.name(), msec, buf_size); } #endif @@ -579,38 +600,26 @@ class Speed final : public Command { Botan::secure_vector<uint8_t> buffer(buf_size); - rng.add_entropy(buffer.data(), buffer.size()); - rng.reseed(256); +#if defined(BOTAN_HAS_SYSTEM_RNG) + rng.reseed_from_rng(Botan::system_rng(), 256); +#endif Timer timer(rng_name, "", "generate", buffer.size()); timer.run_until_elapsed(runtime, [&] { rng.randomize(buffer.data(), buffer.size()); }); output() << Timer::result_string_bps(timer); } - void bench_entropy_sources(const std::chrono::milliseconds runtime) + void bench_entropy_sources(const std::chrono::milliseconds) { Botan::Entropy_Sources& srcs = Botan::Entropy_Sources::global_sources(); - typedef std::chrono::system_clock clock; - - auto deadline = clock::now() + runtime; - for(auto src : srcs.enabled_sources()) { - double entropy_bits = 0.0; - size_t samples = 0; - std::vector<size_t> entropy; - - Botan::Entropy_Accumulator accum( - [&](const uint8_t buf[], size_t buf_len, double buf_entropy) -> bool { - entropy.insert(entropy.end(), buf, buf + buf_len); - entropy_bits += buf_entropy; - samples += 1; - return (samples > 1024 || entropy_bits > 1024 || clock::now() > deadline); - }); + size_t entropy_bits = 0; + Botan_Tests::SeedCapturing_RNG rng; Timer timer(src, "", "bytes"); - timer.run([&] { srcs.poll_just(accum, src); }); + timer.run([&] { entropy_bits = srcs.poll_just(rng, src); }); #if defined(BOTAN_HAS_COMPRESSION) std::unique_ptr<Botan::Compression_Algorithm> comp(Botan::make_compressor("zlib")); @@ -618,13 +627,13 @@ class Speed final : public Command if(comp) { - compressed.assign(entropy.begin(), entropy.end()); + compressed.assign(rng.seed_material().begin(), rng.seed_material().end()); comp->start(9); comp->finish(compressed); } #endif - output() << "Entropy source " << src << " output " << entropy.size() << " bytes" + output() << "Entropy source " << src << " output " << rng.seed_material().size() << " bytes" << " estimated entropy " << entropy_bits << " in " << timer.milliseconds() << " ms"; @@ -635,10 +644,45 @@ class Speed final : public Command } #endif - output() << " total samples " << samples << "\n"; + output() << " total samples " << rng.samples() << "\n"; } } +#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<uint8_t> 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"); + + output() << Timer::result_string_ops(enc_timer); + output() << Timer::result_string_ops(dec_timer); + } +#endif + #if defined(BOTAN_HAS_NUMBERTHEORY) void bench_inverse_mod(const std::chrono::milliseconds runtime) diff --git a/src/cli/tls_client.cpp b/src/cli/tls_client.cpp index 6af2f56f8..caf7d4a1f 100644 --- a/src/cli/tls_client.cpp +++ b/src/cli/tls_client.cpp @@ -1,5 +1,6 @@ /* * (C) 2014,2015 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -35,7 +36,7 @@ namespace Botan_CLI { -class TLS_Client final : public Command +class TLS_Client final : public Command, public Botan::TLS::Callbacks { public: TLS_Client() : Command("tls_client host --port=443 --print-certs --policy= " @@ -98,15 +99,10 @@ class TLS_Client final : public Command const std::vector<std::string> protocols_to_offer = Botan::split_on("next-protocols", ','); - int sockfd = connect_to_host(host, port, use_tcp); + m_sockfd = connect_to_host(host, port, use_tcp); using namespace std::placeholders; - auto socket_write = - use_tcp ? - std::bind(stream_socket_write, sockfd, _1, _2) : - std::bind(dgram_socket_write, sockfd, _1, _2); - auto version = policy->latest_supported_version(!use_tcp); if(flag_set("tls1.0")) @@ -118,10 +114,7 @@ class TLS_Client final : public Command version = Botan::TLS::Protocol_Version::TLS_V11; } - Botan::TLS::Client client(socket_write, - std::bind(&TLS_Client::process_data, this, _1, _2), - std::bind(&TLS_Client::alert_received, this, _1, _2, _3), - std::bind(&TLS_Client::handshake_complete, this, _1), + Botan::TLS::Client client(*this, *session_mgr, creds, *policy, @@ -136,7 +129,7 @@ class TLS_Client final : public Command { fd_set readfds; FD_ZERO(&readfds); - FD_SET(sockfd, &readfds); + FD_SET(m_sockfd, &readfds); if(client.is_active()) { @@ -152,13 +145,13 @@ class TLS_Client final : public Command struct timeval timeout = { 1, 0 }; - ::select(sockfd + 1, &readfds, nullptr, nullptr, &timeout); + ::select(m_sockfd + 1, &readfds, nullptr, nullptr, &timeout); - if(FD_ISSET(sockfd, &readfds)) + if(FD_ISSET(m_sockfd, &readfds)) { uint8_t buf[4*1024] = { 0 }; - ssize_t got = ::read(sockfd, buf, sizeof(buf)); + ssize_t got = ::read(m_sockfd, buf, sizeof(buf)); if(got == 0) { @@ -216,7 +209,7 @@ class TLS_Client final : public Command } } - ::close(sockfd); + ::close(m_sockfd); } private: @@ -256,7 +249,7 @@ class TLS_Client final : public Command return fd; } - bool handshake_complete(const Botan::TLS::Session& session) + bool tls_session_established(const Botan::TLS::Session& session) override { output() << "Handshake complete, " << session.version().to_string() << " using " << session.ciphersuite().to_string() << "\n"; @@ -290,13 +283,13 @@ class TLS_Client final : public Command throw CLI_Error("Socket write failed errno=" + std::to_string(errno)); } - static void stream_socket_write(int sockfd, const uint8_t buf[], size_t length) + void tls_emit_data(const uint8_t buf[], size_t length) override { size_t offset = 0; while(length) { - ssize_t sent = ::send(sockfd, (const char*)buf + offset, + ssize_t sent = ::send(m_sockfd, (const char*)buf + offset, length, MSG_NOSIGNAL); if(sent == -1) @@ -312,16 +305,19 @@ class TLS_Client final : public Command } } - void alert_received(Botan::TLS::Alert alert, const uint8_t [], size_t ) + void tls_alert(Botan::TLS::Alert alert) override { output() << "Alert: " << alert.type_string() << "\n"; } - void process_data(const uint8_t buf[], size_t buf_size) + 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; }; BOTAN_REGISTER_COMMAND("tls_client", TLS_Client); diff --git a/src/cli/tls_proxy.cpp b/src/cli/tls_proxy.cpp index 2929e473d..5140654de 100644 --- a/src/cli/tls_proxy.cpp +++ b/src/cli/tls_proxy.cpp @@ -1,6 +1,7 @@ /* * TLS Server Proxy * (C) 2014,2015 Jack Lloyd +* (C) 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -59,7 +60,7 @@ void log_text_message(const char* where, const uint8_t buf[], size_t buf_len) //std::cout << where << ' ' << std::string(c, c + buf_len) << std::endl; } -class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_session> +class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_session>, public Botan::TLS::Callbacks { public: enum { readbuf_size = 4 * 1024 }; @@ -111,10 +112,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio m_server_endpoints(endpoints), m_client_socket(io), m_server_socket(io), - m_tls(boost::bind(&tls_proxy_session::tls_proxy_write_to_client, this, _1, _2), - boost::bind(&tls_proxy_session::tls_client_write_to_proxy, this, _1, _2), - boost::bind(&tls_proxy_session::tls_alert_cb, this, _1, _2, _3), - boost::bind(&tls_proxy_session::tls_handshake_complete, this, _1), + m_tls(*this, session_manager, credentials, policy, @@ -167,7 +165,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio { m_client_socket.close(); } - tls_proxy_write_to_client(nullptr, 0); // initiate another write if needed + tls_emit_data(nullptr, 0); // initiate another write if needed } void handle_server_write_completion(const boost::system::error_code& error) @@ -183,13 +181,13 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio proxy_write_to_server(nullptr, 0); // initiate another write if needed } - void tls_client_write_to_proxy(const uint8_t buf[], size_t buf_len) + 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_proxy_write_to_client(const uint8_t buf[], size_t 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); @@ -268,7 +266,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio boost::asio::placeholders::bytes_transferred))); } - bool tls_handshake_complete(const Botan::TLS::Session& session) + bool tls_session_established(const Botan::TLS::Session& session) override { //std::cout << "Handshake from client complete" << std::endl; @@ -292,7 +290,7 @@ class tls_proxy_session : public boost::enable_shared_from_this<tls_proxy_sessio return true; } - void tls_alert_cb(Botan::TLS::Alert alert, const uint8_t[], size_t) + void tls_alert(Botan::TLS::Alert alert) override { if(alert.type() == Botan::TLS::Alert::CLOSE_NOTIFY) { diff --git a/src/cli/utils.cpp b/src/cli/utils.cpp index 199a7894f..5ec8f295e 100644 --- a/src/cli/utils.cpp +++ b/src/cli/utils.cpp @@ -7,7 +7,6 @@ #include "cli.h" #include <botan/version.h> -#include <botan/auto_rng.h> #include <botan/hash.h> #include <botan/cpuid.h> #include <botan/hex.h> @@ -16,10 +15,18 @@ #include <botan/base64.h> #endif +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif + #if defined(BOTAN_HAS_SYSTEM_RNG) #include <botan/system_rng.h> #endif +#if defined(BOTAN_HAS_RDRAND_RNG) + #include <botan/rdrand_rng.h> +#endif + #if defined(BOTAN_HAS_HTTP_UTIL) #include <botan/http_util.h> #endif @@ -149,24 +156,43 @@ BOTAN_REGISTER_COMMAND("hash", Hash); class RNG final : public Command { public: - RNG() : Command("rng bytes --system") {} + RNG() : Command("rng --system --rdrand *bytes") {} void go() override { - const size_t bytes = get_arg_sz("bytes"); + std::unique_ptr<Botan::RNG> rng; if(flag_set("system")) { #if defined(BOTAN_HAS_SYSTEM_RNG) - output() << Botan::hex_encode(Botan::system_rng().random_vec(bytes)) << "\n"; + rng.reset(new Botan::System_RNG); #else error_output() << "system_rng disabled in build\n"; + return; +#endif + } + else if(flag_set("rdrand")) + { +#if defined(BOTAN_HAS_RDRAND_RNG) + rng.reset(new Botan::RDRAND_RNG); +#else + error_output() << "rdrand_rng disabled in build\n"; + return; #endif } else { - Botan::AutoSeeded_RNG rng; - output() << Botan::hex_encode(rng.random_vec(bytes)) << "\n"; +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + rng.reset(new Botan::AutoSeeded_RNG); +#else + error_output() << "auto_rng disabled in build\n"; + return; +#endif + } + + for(const std::string& req : get_arg_list("bytes")) + { + output() << Botan::hex_encode(rng->random_vec(Botan::to_u32bit(req))) << "\n"; } } }; @@ -240,7 +266,7 @@ class Generate_Bcrypt final : public Command void go() override { const std::string password = get_arg("password"); - const size_t wf = get_arg_sz("work_factor"); + const size_t wf = get_arg_sz("work-factor"); output() << Botan::generate_bcrypt(password, rng(), wf) << "\n"; } diff --git a/src/lib/asn1/asn1_time.cpp b/src/lib/asn1/asn1_time.cpp index 67fc8b5ac..b091c4160 100644 --- a/src/lib/asn1/asn1_time.cpp +++ b/src/lib/asn1/asn1_time.cpp @@ -250,6 +250,11 @@ bool X509_Time::passes_sanity_check() const 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 */ diff --git a/src/lib/asn1/asn1_time.h b/src/lib/asn1/asn1_time.h index ba5b84838..ee30221ee 100644 --- a/src/lib/asn1/asn1_time.h +++ b/src/lib/asn1/asn1_time.h @@ -46,6 +46,9 @@ class BOTAN_DLL X509_Time final : public ASN1_Object /// 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; diff --git a/src/lib/asn1/oid_lookup/default.cpp b/src/lib/asn1/oid_lookup/default.cpp index 9e16cfc0b..0d64a8bef 100644 --- a/src/lib/asn1/oid_lookup/default.cpp +++ b/src/lib/asn1/oid_lookup/default.cpp @@ -33,6 +33,9 @@ const char* default_oid_list() // ecgPublicKey (see https://www.teletrust.de/projekte/oid/) "1.3.36.3.3.2.5.2.1 = ECGDSA" "\n" + // EC-KCDSA mechanism (Elliptic Curve KCDSA) + "1.0.14888.3.0.5 = ECKCDSA" "\n" + "1.2.643.2.2.19 = GOST-34.10" "\n" // Block ciphers @@ -102,13 +105,6 @@ const char* default_oid_list() "2.16.840.1.101.3.4.3.1 = DSA/EMSA1(SHA-224)" "\n" "2.16.840.1.101.3.4.3.2 = DSA/EMSA1(SHA-256)" "\n" - "0.4.0.127.0.7.1.1.4.1.1 = ECDSA/EMSA1_BSI(SHA-160)" "\n" - "0.4.0.127.0.7.1.1.4.1.2 = ECDSA/EMSA1_BSI(SHA-224)" "\n" - "0.4.0.127.0.7.1.1.4.1.3 = ECDSA/EMSA1_BSI(SHA-256)" "\n" - "0.4.0.127.0.7.1.1.4.1.4 = ECDSA/EMSA1_BSI(SHA-384)" "\n" - "0.4.0.127.0.7.1.1.4.1.5 = ECDSA/EMSA1_BSI(SHA-512)" "\n" - "0.4.0.127.0.7.1.1.4.1.6 = ECDSA/EMSA1_BSI(RIPEMD-160)" "\n" - "1.2.840.10045.4.1 = ECDSA/EMSA1(SHA-160)" "\n" "1.2.840.10045.4.3.1 = ECDSA/EMSA1(SHA-224)" "\n" "1.2.840.10045.4.3.2 = ECDSA/EMSA1(SHA-256)" "\n" @@ -122,6 +118,10 @@ const char* default_oid_list() "1.3.36.3.3.2.5.4.5 = ECGDSA/EMSA1(SHA-384)" "\n" "1.3.36.3.3.2.5.4.6 = ECGDSA/EMSA1(SHA-512)" "\n" + "1.2.410.200004.1.100.4.3 = ECKCDSA/EMSA1(SHA-1)" "\n" + "1.2.410.200004.1.100.4.4 = ECKCDSA/EMSA1(SHA-224)" "\n" + "1.2.410.200004.1.100.4.5 = ECKCDSA/EMSA1(SHA-256)" "\n" + "1.2.643.2.2.3 = GOST-34.10/EMSA1(GOST-R-34.11-94)" "\n" "1.3.6.1.4.1.25258.2.1.1.1 = RW/EMSA2(RIPEMD-160)" "\n" @@ -247,6 +247,8 @@ const char* default_oid_list() "1.2.643.2.2.36.0 = gost_256A" "\n" "0.4.0.127.0.7.3.1.2.1 = CertificateHolderAuthorizationTemplate" "\n" + + "1.2.250.1.223.101.256.1 = frp256v1" "\n" ; } diff --git a/src/lib/base/secmem.h b/src/lib/base/secmem.h index 63d4e5296..01024a104 100644 --- a/src/lib/base/secmem.h +++ b/src/lib/base/secmem.h @@ -82,7 +82,12 @@ class secure_allocator ::new(static_cast<void*>(p)) U(std::forward<Args>(args)...); } +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable: 4100) template<typename U> void destroy(U* p) { p->~U(); } +#pragma warning(pop) +#endif }; template<typename T, typename U> inline bool diff --git a/src/lib/block/threefish_avx2/threefish_avx2.cpp b/src/lib/block/threefish_avx2/threefish_avx2.cpp index bed98fafa..9b808a221 100644 --- a/src/lib/block/threefish_avx2/threefish_avx2.cpp +++ b/src/lib/block/threefish_avx2/threefish_avx2.cpp @@ -1,6 +1,6 @@ /* * Threefish-512 using AVX2 -* (C) 2013 Jack Lloyd +* (C) 2013,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -34,6 +34,41 @@ inline void deinterleave_epi64(__m256i& X0, __m256i& X1) X1 = _mm256_unpackhi_epi64(T0, T1); } +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. + + 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); + } + + } void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) const @@ -81,10 +116,9 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c 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, R); \ + X1 = _mm256_add_epi64(X1, _mm256_set_epi64x(R,0,0,0)); \ X0 = _mm256_add_epi64(X0, T0); \ X1 = _mm256_add_epi64(X1, T1); \ - R = _mm256_add_epi64(R, ONE); \ } while(0) #define THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K0, K1, T0I, T1I) \ @@ -95,64 +129,52 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c X2 = _mm256_add_epi64(X2, K0); \ X1 = _mm256_add_epi64(X1, K1); \ X3 = _mm256_add_epi64(X3, K1); \ - T1 = _mm256_add_epi64(T1, R); \ + 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); \ - R = _mm256_add_epi64(R, ONE); \ } while(0) -#define THREEFISH_ENC_8_ROUNDS(X0, X1, R, K1, K2, K3, T0, T1, T2) \ +#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, K1, K2, T0, T1); \ + 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, K2, K3, T2, T0); \ + THREEFISH_INJECT_KEY(X0, X1, R+1, K1, K2, T2, T0); \ } while(0) -#define THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K1, K2, K3, T0, T1, T2) \ +#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, K1, K2, T0, T1); \ + 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, K2, K3, T2, T0); \ + THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R+1, K1, K2, T2, T0); \ } 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 ONE = _mm256_set_epi64x(1, 0, 0, 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<const __m256i*>(in); __m256i* out_mm = reinterpret_cast<__m256i*>(out); - + while(blocks >= 2) { __m256i X0 = _mm256_loadu_si256(in_mm++); @@ -162,24 +184,20 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); - __m256i R = _mm256_set_epi64x(0, 0, 0, 0); - interleave_epi64(X0, X1); interleave_epi64(X2, X3); - THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, R, K0, K1, 2, 3); + THREEFISH_INJECT_KEY_2(X0, X1, X2, X3, 0, K1, K2, 2, 3); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K1,K2,K3, 1, 2, 3); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K3,K4,K5, 2, 3, 1); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K5,K6,K7, 3, 1, 2); - - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K7,K8,K0, 1, 2, 3); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K0,K1,K2, 2, 3, 1); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K2,K3,K4, 3, 1, 2); - - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K4,K5,K6, 1, 2, 3); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K6,K7,K8, 2, 3, 1); - THREEFISH_ENC_2_8_ROUNDS(X0, X1, X2, X3, R, K8,K0,K1, 3, 1, 2); + 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); @@ -191,7 +209,7 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c blocks -= 2; } - + for(size_t i = 0; i != blocks; ++i) { __m256i X0 = _mm256_loadu_si256(in_mm++); @@ -199,23 +217,19 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c const __m256i T = _mm256_set_epi64x(T_64[0], T_64[1], T_64[2], 0); - __m256i R = _mm256_set_epi64x(0, 0, 0, 0); - interleave_epi64(X0, X1); - THREEFISH_INJECT_KEY(X0, X1, R, K0, K1, 2, 3); - - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K1,K2,K3, 1, 2, 3); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K3,K4,K5, 2, 3, 1); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K5,K6,K7, 3, 1, 2); - - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K7,K8,K0, 1, 2, 3); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K0,K1,K2, 2, 3, 1); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K2,K3,K4, 3, 1, 2); + THREEFISH_INJECT_KEY(X0, X1, 0, K1, K2, 2, 3); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K4,K5,K6, 1, 2, 3); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K6,K7,K8, 2, 3, 1); - THREEFISH_ENC_8_ROUNDS(X0, X1, R, K8,K0,K1, 3, 1, 2); + 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); @@ -226,7 +240,7 @@ void Threefish_512_AVX2::encrypt_n(const byte in[], byte out[], size_t blocks) c #undef THREEFISH_ENC_8_ROUNDS #undef THREEFISH_ROUND #undef THREEFISH_INJECT_KEY -#undef THREEFISH_ENC_2_8_ROUNDS +#undef THREEFISH_DEC_2_8_ROUNDS #undef THREEFISH_ROUND_2 #undef THREEFISH_INJECT_KEY_2 } @@ -255,21 +269,35 @@ void Threefish_512_AVX2::decrypt_n(const byte in[], byte out[], size_t blocks) c 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, R); \ - R = _mm256_sub_epi64(R, ONE); \ + 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, K2, K3, T2, T0); \ + 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); \ @@ -282,6 +310,36 @@ void Threefish_512_AVX2::decrypt_n(const byte in[], byte out[], size_t blocks) c 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] @@ -297,33 +355,64 @@ void Threefish_512_AVX2::decrypt_n(const byte in[], byte out[], size_t blocks) c 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 ONE = _mm256_set_epi64x(1, 0, 0, 0); - const __m256i* in_mm = reinterpret_cast<const __m256i*>(in); __m256i* out_mm = reinterpret_cast<__m256i*>(out); - for(size_t i = 0; i != blocks; ++i) + 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); - __m256i R = _mm256_set_epi64x(18, 0, 0, 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, R, K8,K0,K1, 3, 1, 2); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K6,K7,K8, 2, 3, 1); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K4,K5,K6, 1, 2, 3); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K2,K3,K4, 3, 1, 2); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K0,K1,K2, 2, 3, 1); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K7,K8,K0, 1, 2, 3); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K5,K6,K7, 3, 1, 2); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K3,K4,K5, 2, 3, 1); - THREEFISH_DEC_8_ROUNDS(X0, X1, R, K1,K2,K3, 1, 2, 3); - - THREEFISH_INJECT_KEY(X0, X1, R, K0, K1, 2, 3); + 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); diff --git a/src/lib/cert/cvc/asn1_eac_str.cpp b/src/lib/cert/cvc/asn1_eac_str.cpp deleted file mode 100644 index 72ad24926..000000000 --- a/src/lib/cert/cvc/asn1_eac_str.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* -* Simple ASN.1 String Types -* (C) 2007 FlexSecure GmbH -* 2008-2011 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/eac_asn_obj.h> -#include <botan/der_enc.h> -#include <botan/ber_dec.h> -#include <botan/charset.h> -#include <botan/parsing.h> -#include <sstream> -#include <ios> - -namespace Botan { - -/* -* Create an ASN1_EAC_String -*/ -ASN1_EAC_String::ASN1_EAC_String(const std::string& str, ASN1_Tag t) : m_tag(t) - { - m_iso_8859_str = Charset::transcode(str, LOCAL_CHARSET, LATIN1_CHARSET); - - if(!sanity_check()) - throw Invalid_Argument("ASN1_EAC_String contains illegal characters"); - } - -/* -* Return this string in ISO 8859-1 encoding -*/ -std::string ASN1_EAC_String::iso_8859() const - { - return m_iso_8859_str; - } - -/* -* Return this string in local encoding -*/ -std::string ASN1_EAC_String::value() const - { - return Charset::transcode(m_iso_8859_str, LATIN1_CHARSET, LOCAL_CHARSET); - } - -/* -* Return the type of this string object -*/ -ASN1_Tag ASN1_EAC_String::tagging() const - { - return m_tag; - } - -/* -* DER encode an ASN1_EAC_String -*/ -void ASN1_EAC_String::encode_into(DER_Encoder& encoder) const - { - std::string value = iso_8859(); - encoder.add_object(tagging(), APPLICATION, value); - } - -/* -* Decode a BER encoded ASN1_EAC_String -*/ -void ASN1_EAC_String::decode_from(BER_Decoder& source) - { - BER_Object obj = source.get_next_object(); - - if(obj.type_tag != m_tag) - { - std::stringstream ss; - - ss << "ASN1_EAC_String tag mismatch, tag was " - << std::hex << obj.type_tag - << " expected " - << std::hex << m_tag; - - throw Decoding_Error(ss.str()); - } - - Character_Set charset_is; - charset_is = LATIN1_CHARSET; - - try - { - *this = ASN1_EAC_String( - Charset::transcode(ASN1::to_string(obj), LOCAL_CHARSET, charset_is), - obj.type_tag); - } - catch(Invalid_Argument& inv_arg) - { - throw Decoding_Error(std::string("ASN1_EAC_String decoding failed: ") + - inv_arg.what()); - } - } - -// checks for compliance to the alphabet defined in TR-03110 v1.10, 2007-08-20 -// p. 43 -bool ASN1_EAC_String::sanity_check() const - { - const byte* rep = reinterpret_cast<const byte*>(m_iso_8859_str.data()); - const size_t rep_len = m_iso_8859_str.size(); - - for(size_t i = 0; i != rep_len; ++i) - { - if((rep[i] < 0x20) || ((rep[i] >= 0x7F) && (rep[i] < 0xA0))) - return false; - } - - return true; - } - -bool operator==(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) - { - return (lhs.iso_8859() == rhs.iso_8859()); - } - -ASN1_Car::ASN1_Car(std::string const& str) - : ASN1_EAC_String(str, ASN1_Tag(2)) - {} - -ASN1_Chr::ASN1_Chr(std::string const& str) - : ASN1_EAC_String(str, ASN1_Tag(32)) - {} - -} diff --git a/src/lib/cert/cvc/asn1_eac_tm.cpp b/src/lib/cert/cvc/asn1_eac_tm.cpp deleted file mode 100644 index 9c65fcf6a..000000000 --- a/src/lib/cert/cvc/asn1_eac_tm.cpp +++ /dev/null @@ -1,297 +0,0 @@ -/* -* EAC Time Types -* (C) 2007 FlexSecure GmbH -* 2008-2009 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/eac_asn_obj.h> -#include <botan/der_enc.h> -#include <botan/ber_dec.h> -#include <botan/charset.h> -#include <botan/parsing.h> -#include <botan/internal/rounding.h> -#include <botan/calendar.h> -#include <sstream> -#include <iomanip> - -namespace Botan { - -namespace { - -std::vector<byte> enc_two_digit(u32bit in) - { - std::vector<byte> result; - in %= 100; - if(in < 10) - result.push_back(0x00); - else - { - u32bit y_first_pos = round_down<u32bit>(in, 10) / 10; - result.push_back(static_cast<byte>(y_first_pos)); - } - - u32bit y_sec_pos = in % 10; - result.push_back(static_cast<byte>(y_sec_pos)); - return result; - } - -u32bit dec_two_digit(byte b1, byte b2) - { - u32bit upper = b1; - u32bit lower = b2; - - if(upper > 9 || lower > 9) - throw Invalid_Argument("CVC dec_two_digit value too large"); - - return upper*10 + lower; - } - -} - -/* -* Create an EAC_Time -*/ -EAC_Time::EAC_Time(const std::chrono::system_clock::time_point& time, - ASN1_Tag t) : m_tag(t) - { - calendar_point cal = calendar_value(time); - - m_year = cal.year; - m_month = cal.month; - m_day = cal.day; - } - -/* -* Create an EAC_Time -*/ -EAC_Time::EAC_Time(const std::string& t_spec, ASN1_Tag t) : m_tag(t) - { - set_to(t_spec); - } - -/* -* Create an EAC_Time -*/ -EAC_Time::EAC_Time(u32bit y, u32bit m, u32bit d, ASN1_Tag t) : - m_year(y), m_month(m), m_day(d), m_tag(t) - { - } - -/* -* Set the time with a human readable string -*/ -void EAC_Time::set_to(const std::string& time_str) - { - if(time_str == "") - { - m_year = m_month = m_day = 0; - return; - } - - std::vector<std::string> params; - std::string current; - - for(u32bit j = 0; j != time_str.size(); ++j) - { - if(Charset::is_digit(time_str[j])) - current += time_str[j]; - else - { - if(current != "") - params.push_back(current); - current.clear(); - } - } - if(current != "") - params.push_back(current); - - if(params.size() != 3) - throw Invalid_Argument("Invalid time specification " + time_str); - - m_year = to_u32bit(params[0]); - m_month = to_u32bit(params[1]); - m_day = to_u32bit(params[2]); - - if(!passes_sanity_check()) - throw Invalid_Argument("Invalid time specification " + time_str); - } - - -/* -* DER encode a EAC_Time -*/ -void EAC_Time::encode_into(DER_Encoder& der) const - { - der.add_object(m_tag, APPLICATION, - encoded_eac_time()); - } - -/* -* Return a string representation of the time -*/ -std::string EAC_Time::as_string() const - { - if(time_is_set() == false) - throw Invalid_State("EAC_Time::as_string: No time set"); - - return std::to_string(m_year * 10000 + m_month * 100 + m_day); - } - -/* -* Return if the time has been set somehow -*/ -bool EAC_Time::time_is_set() const - { - return (m_year != 0); - } - -/* -* Return a human readable string representation -*/ -std::string EAC_Time::readable_string() const - { - if(time_is_set() == false) - throw Invalid_State("EAC_Time::readable_string: No time set"); - - // desired format: "%04d/%02d/%02d" - std::stringstream output; - output << std::setfill('0') - << std::setw(4) << m_year << "/" - << std::setw(2) << m_month << "/" - << std::setw(2) << m_day; - return output.str(); - } - -/* -* Do a general sanity check on the time -*/ -bool EAC_Time::passes_sanity_check() const - { - if(m_year < 2000 || m_year > 2099) - return false; - if(m_month == 0 || m_month > 12) - return false; - if(m_day == 0 || m_day > 31) - return false; - - return true; - } - -/* -* modification functions -*/ -void EAC_Time::add_years(u32bit years) - { - m_year += years; - } - -void EAC_Time::add_months(u32bit months) - { - m_year += months/12; - m_month += months % 12; - if(m_month > 12) - { - m_year += 1; - m_month -= 12; - } - } - -/* -* Compare this time against another -*/ -s32bit EAC_Time::cmp(const EAC_Time& other) const - { - if(time_is_set() == false) - throw Invalid_State("EAC_Time::cmp: No time set"); - - const s32bit 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; - - return SAME_TIME; - } - -/* -* Compare two EAC_Times for in various ways -*/ -bool operator==(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) == 0); - } - -bool operator!=(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) != 0); - } - -bool operator<=(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) <= 0); - } - -bool operator>=(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) >= 0); - } - -bool operator>(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) > 0); - } - -bool operator<(const EAC_Time& t1, const EAC_Time& t2) - { - return (t1.cmp(t2) < 0); - } - -/* -* Decode a BER encoded EAC_Time -*/ -void EAC_Time::decode_from(BER_Decoder& source) - { - BER_Object obj = source.get_next_object(); - - if(obj.type_tag != m_tag) - throw BER_Decoding_Error("Tag mismatch when decoding"); - - if(obj.value.size() != 6) - { - throw Decoding_Error("EAC_Time decoding failed"); - } - - try - { - u32bit tmp_year = dec_two_digit(obj.value[0], obj.value[1]); - u32bit tmp_mon = dec_two_digit(obj.value[2], obj.value[3]); - u32bit tmp_day = dec_two_digit(obj.value[4], obj.value[5]); - m_year = tmp_year + 2000; - m_month = tmp_mon; - m_day = tmp_day; - } - catch (Invalid_Argument) - { - throw Decoding_Error("EAC_Time decoding failed"); - } - - } - -/* -* make the value an octet string for encoding -*/ -std::vector<byte> EAC_Time::encoded_eac_time() const - { - std::vector<byte> result; - result += enc_two_digit(m_year); - result += enc_two_digit(m_month); - result += enc_two_digit(m_day); - return result; - } - -} diff --git a/src/lib/cert/cvc/cvc_ado.cpp b/src/lib/cert/cvc/cvc_ado.cpp deleted file mode 100644 index f803c6bf3..000000000 --- a/src/lib/cert/cvc/cvc_ado.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* -* CVC Certificate Constructor -* (C) 2007 FlexSecure GmbH -* 2008 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/cvc_ado.h> -#include <fstream> - -namespace Botan { - -EAC1_1_ADO::EAC1_1_ADO(DataSource& in) - { - init(in); - do_decode(); - } - -EAC1_1_ADO::EAC1_1_ADO(const std::string& in) - { - DataSource_Stream stream(in, true); - init(stream); - do_decode(); - } - -void EAC1_1_ADO::force_decode() - { - std::vector<byte> inner_cert; - BER_Decoder(m_tbs_bits) - .start_cons(ASN1_Tag(33)) - .raw_bytes(inner_cert) - .end_cons() - .decode(m_car) - .verify_end(); - - std::vector<byte> req_bits = DER_Encoder() - .start_cons(ASN1_Tag(33), APPLICATION) - .raw_bytes(inner_cert) - .end_cons() - .get_contents_unlocked(); - - DataSource_Memory req_source(req_bits); - m_req = EAC1_1_Req(req_source); - m_sig_algo = m_req.m_sig_algo; - } - -std::vector<byte> EAC1_1_ADO::make_signed(PK_Signer& signer, - const std::vector<byte>& tbs_bits, - RandomNumberGenerator& rng) - { - const std::vector<byte> concat_sig = signer.sign_message(tbs_bits, rng); - - return DER_Encoder() - .start_cons(ASN1_Tag(7), APPLICATION) - .raw_bytes(tbs_bits) - .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons() - .get_contents_unlocked(); - } - -ASN1_Car EAC1_1_ADO::get_car() const - { - return m_car; - } - -void EAC1_1_ADO::decode_info(DataSource& source, - std::vector<byte> & res_tbs_bits, - ECDSA_Signature & res_sig) - { - std::vector<byte> concat_sig; - std::vector<byte> cert_inner_bits; - ASN1_Car car; - - BER_Decoder(source) - .start_cons(ASN1_Tag(7)) - .start_cons(ASN1_Tag(33)) - .raw_bytes(cert_inner_bits) - .end_cons() - .decode(car) - .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons(); - - std::vector<byte> enc_cert = DER_Encoder() - .start_cons(ASN1_Tag(33), APPLICATION) - .raw_bytes(cert_inner_bits) - .end_cons() - .get_contents_unlocked(); - - res_tbs_bits = enc_cert; - res_tbs_bits += DER_Encoder().encode(car).get_contents(); - res_sig = decode_concatenation(concat_sig); - } - -void EAC1_1_ADO::encode(Pipe& out, X509_Encoding encoding) const - { - if(encoding == PEM) - throw Invalid_Argument("EAC1_1_ADO::encode() cannot PEM encode an EAC object"); - - auto concat_sig = EAC1_1_obj<EAC1_1_ADO>::m_sig.get_concatenation(); - - out.write(DER_Encoder() - .start_cons(ASN1_Tag(7), APPLICATION) - .raw_bytes(m_tbs_bits) - .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons() - .get_contents()); - } - -std::vector<byte> EAC1_1_ADO::tbs_data() const - { - return m_tbs_bits; - } - -bool EAC1_1_ADO::operator==(EAC1_1_ADO const& rhs) const - { - return (this->get_concat_sig() == rhs.get_concat_sig() - && this->tbs_data() == rhs.tbs_data() - && this->get_car() == rhs.get_car()); - } - -EAC1_1_Req EAC1_1_ADO::get_request() const - { - return m_req; - } - -} diff --git a/src/lib/cert/cvc/cvc_ado.h b/src/lib/cert/cvc/cvc_ado.h deleted file mode 100644 index 4b861ec81..000000000 --- a/src/lib/cert/cvc/cvc_ado.h +++ /dev/null @@ -1,98 +0,0 @@ -/* -* EAC1_1 CVC ADO -* (C) 2008 Falko Strenzke -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_CVC_ADO_H__ -#define BOTAN_EAC_CVC_ADO_H__ - -#include <botan/eac_obj.h> -#include <botan/eac_asn_obj.h> -#include <botan/cvc_req.h> -#include <string> - -namespace Botan { - -/** -* This class represents a TR03110 (EAC) v1.1 CVC ADO request -*/ - - // CRTP continuation from EAC1_1_obj -class BOTAN_DLL EAC1_1_ADO : public EAC1_1_obj<EAC1_1_ADO> - { - public: - friend class EAC1_1_obj<EAC1_1_ADO>; - - /** - * Construct a CVC ADO request from a DER encoded CVC ADO request file. - * @param str the path to the DER encoded file - */ - EAC1_1_ADO(const std::string& str); - - /** - * Construct a CVC ADO request from a data source - * @param source the data source - */ - EAC1_1_ADO(DataSource& source); - - /** - * Create a signed CVC ADO request from to be signed (TBS) data - * @param signer the signer used to sign the CVC ADO request - * @param tbs_bits the TBS data to sign - * @param rng a random number generator - */ - static std::vector<byte> make_signed( - PK_Signer& signer, - const std::vector<byte>& tbs_bits, - RandomNumberGenerator& rng); - - /** - * Get the CAR of this CVC ADO request - * @result the CAR of this CVC ADO request - */ - ASN1_Car get_car() const; - - /** - * Get the CVC request contained in this object. - * @result the CVC request inside this CVC ADO request - */ - EAC1_1_Req get_request() const; - - /** - * Encode this object into a pipe. Only DER is supported. - * @param out the pipe to encode this object into - * @param encoding the encoding type to use, must be DER - */ - void encode(Pipe& out, X509_Encoding encoding) const; - - bool operator==(EAC1_1_ADO const& rhs) const; - - /** - * Get the TBS data of this CVC ADO request. - * @result the TBS data - */ - std::vector<byte> tbs_data() const; - - virtual ~EAC1_1_ADO() {} - private: - ASN1_Car m_car; - EAC1_1_Req m_req; - - void force_decode(); - static void decode_info(DataSource& source, - std::vector<byte> & res_tbs_bits, - ECDSA_Signature & res_sig); - }; - -inline bool operator!=(EAC1_1_ADO const& lhs, EAC1_1_ADO const& rhs) - { - return (!(lhs == rhs)); - } - -} - -#endif - - diff --git a/src/lib/cert/cvc/cvc_cert.cpp b/src/lib/cert/cvc/cvc_cert.cpp deleted file mode 100644 index 280a8acda..000000000 --- a/src/lib/cert/cvc/cvc_cert.cpp +++ /dev/null @@ -1,135 +0,0 @@ -/* -* (C) 2007 FlexSecure GmbH -* 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/cvc_cert.h> -#include <botan/oids.h> - -namespace Botan { - -ASN1_Car EAC1_1_CVC::get_car() const - { - return m_car; - } - -ASN1_Ced EAC1_1_CVC::get_ced() const - { - return m_ced; - } -ASN1_Cex EAC1_1_CVC::get_cex() const - { - return m_cex; - } -u32bit EAC1_1_CVC::get_chat_value() const - { - return m_chat_val; - } - -/* -* Decode the TBSCertificate data -*/ -void EAC1_1_CVC::force_decode() - { - std::vector<byte> enc_pk; - std::vector<byte> enc_chat_val; - size_t cpi; - BER_Decoder tbs_cert(m_tbs_bits); - tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) - .decode(m_car) - .start_cons(ASN1_Tag(73)) - .raw_bytes(enc_pk) - .end_cons() - .decode(m_chr) - .start_cons(ASN1_Tag(76)) - .decode(m_chat_oid) - .decode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) - .end_cons() - .decode(m_ced) - .decode(m_cex) - .verify_end(); - - if(enc_chat_val.size() != 1) - throw Decoding_Error("CertificateHolderAuthorizationValue was not of length 1"); - - if(cpi != 0) - throw Decoding_Error("EAC1_1 certificate's cpi was not 0"); - - m_pk = decode_eac1_1_key(enc_pk, m_sig_algo); - - m_chat_val = enc_chat_val[0]; - - m_self_signed = (m_car.iso_8859() == m_chr.iso_8859()); - } - -/* -* CVC Certificate Constructor -*/ -EAC1_1_CVC::EAC1_1_CVC(DataSource& in) - { - init(in); - m_self_signed = false; - do_decode(); - } - -EAC1_1_CVC::EAC1_1_CVC(const std::string& in) - { - DataSource_Stream stream(in, true); - init(stream); - m_self_signed = false; - do_decode(); - } - -bool EAC1_1_CVC::operator==(EAC1_1_CVC const& rhs) const - { - return (tbs_data() == rhs.tbs_data() - && get_concat_sig() == rhs.get_concat_sig()); - } - -ECDSA_PublicKey* decode_eac1_1_key(const std::vector<byte>&, - AlgorithmIdentifier&) - { - throw Internal_Error("decode_eac1_1_key: Unimplemented"); - return 0; - } - -EAC1_1_CVC make_cvc_cert(PK_Signer& signer, - const std::vector<byte>& public_key, - ASN1_Car const& car, - ASN1_Chr const& chr, - byte holder_auth_templ, - ASN1_Ced ced, - ASN1_Cex cex, - RandomNumberGenerator& rng) - { - OID chat_oid(OIDS::lookup("CertificateHolderAuthorizationTemplate")); - std::vector<byte> enc_chat_val; - enc_chat_val.push_back(holder_auth_templ); - - std::vector<byte> enc_cpi; - enc_cpi.push_back(0x00); - std::vector<byte> tbs = DER_Encoder() - .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) // cpi - .encode(car) - .raw_bytes(public_key) - .encode(chr) - .start_cons(ASN1_Tag(76), APPLICATION) - .encode(chat_oid) - .encode(enc_chat_val, OCTET_STRING, ASN1_Tag(19), APPLICATION) - .end_cons() - .encode(ced) - .encode(cex) - .get_contents_unlocked(); - - std::vector<byte> signed_cert = - EAC1_1_CVC::make_signed(signer, - EAC1_1_CVC::build_cert_body(tbs), - rng); - - DataSource_Memory source(signed_cert); - return EAC1_1_CVC(source); - } - -} diff --git a/src/lib/cert/cvc/cvc_cert.h b/src/lib/cert/cvc/cvc_cert.h deleted file mode 100644 index a45388550..000000000 --- a/src/lib/cert/cvc/cvc_cert.h +++ /dev/null @@ -1,116 +0,0 @@ -/* -* EAC1_1 CVC -* (C) 2008 Falko Strenzke -* 2008 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_CVC_EAC_H__ -#define BOTAN_CVC_EAC_H__ - -#include <botan/cvc_gen_cert.h> -#include <botan/ecdsa.h> -#include <string> - -namespace Botan { - -/** -* This class represents TR03110 (EAC) v1.1 CV Certificates -*/ -class BOTAN_DLL EAC1_1_CVC : public EAC1_1_gen_CVC<EAC1_1_CVC>//Signed_Object - { - public: - friend class EAC1_1_obj<EAC1_1_CVC>; - - /** - * Get the CAR of the certificate. - * @result the CAR of the certificate - */ - ASN1_Car get_car() const; - - /** - * Get the CED of this certificate. - * @result the CED this certificate - */ - ASN1_Ced get_ced() const; - - /** - * Get the CEX of this certificate. - * @result the CEX this certificate - */ - ASN1_Cex get_cex() const; - - /** - * Get the CHAT value. - * @result the CHAT value - */ - u32bit get_chat_value() const; - - bool operator==(const EAC1_1_CVC&) const; - - /** - * Construct a CVC from a data source - * @param source the data source - */ - EAC1_1_CVC(DataSource& source); - - /** - * Construct a CVC from a file - * @param str the path to the certificate file - */ - EAC1_1_CVC(const std::string& str); - - virtual ~EAC1_1_CVC() {} - private: - void force_decode(); - EAC1_1_CVC() {} - - ASN1_Car m_car; - ASN1_Ced m_ced; - ASN1_Cex m_cex; - byte m_chat_val; - OID m_chat_oid; - }; - -/* -* Comparison -*/ -inline bool operator!=(EAC1_1_CVC const& lhs, EAC1_1_CVC const& rhs) - { - return !(lhs == rhs); - } - -/** -* Create an arbitrary EAC 1.1 CVC. -* The desired key encoding must be set within the key (if applicable). -* @param signer the signer used to sign the certificate -* @param public_key the DER encoded public key to appear in -* the certificate -* @param car the CAR of the certificate -* @param chr the CHR of the certificate -* @param holder_auth_templ the holder authorization value byte to -* appear in the CHAT of the certificate -* @param ced the CED to appear in the certificate -* @param cex the CEX to appear in the certificate -* @param rng a random number generator -*/ -EAC1_1_CVC BOTAN_DLL make_cvc_cert(PK_Signer& signer, - const std::vector<byte>& public_key, - ASN1_Car const& car, - ASN1_Chr const& chr, - byte holder_auth_templ, - ASN1_Ced ced, - ASN1_Cex cex, - RandomNumberGenerator& rng); - -/** -* Decode an EAC encoding ECDSA key -*/ -BOTAN_DLL ECDSA_PublicKey* decode_eac1_1_key(const std::vector<byte>& enc_key, - AlgorithmIdentifier& sig_algo); - -} - -#endif - diff --git a/src/lib/cert/cvc/cvc_gen_cert.h b/src/lib/cert/cvc/cvc_gen_cert.h deleted file mode 100644 index 2c3bca73d..000000000 --- a/src/lib/cert/cvc/cvc_gen_cert.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -* EAC1_1 general CVC -* (C) 2008 Falko Strenzke -* 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_CVC_GEN_CERT_H__ -#define BOTAN_EAC_CVC_GEN_CERT_H__ - -#include <botan/eac_obj.h> -#include <botan/eac_asn_obj.h> -#include <botan/ecdsa.h> -#include <botan/pubkey.h> - -namespace Botan { - -/** -* This class represents TR03110 (EAC) v1.1 generalized CV Certificates -*/ -template<typename Derived> -class EAC1_1_gen_CVC : public EAC1_1_obj<Derived> // CRTP continuation from EAC1_1_obj - { - friend class EAC1_1_obj<EAC1_1_gen_CVC>; - - public: - - /** - * Get this certificates public key. - * @result this certificates public key - */ - Public_Key* subject_public_key() const; - - /** - * Find out whether this object is self signed. - * @result true if this object is self signed - */ - bool is_self_signed() const; - - /** - * Get the CHR of the certificate. - * @result the CHR of the certificate - */ - ASN1_Chr get_chr() const; - - /** - * Put the DER encoded version of this object into a pipe. PEM - * is not supported. - * @param out the pipe to push the DER encoded version into - * @param encoding the encoding to use. Must be DER. - */ - void encode(Pipe& out, X509_Encoding encoding) const; - - /** - * Get the to-be-signed (TBS) data of this object. - * @result the TBS data of this object - */ - std::vector<byte> tbs_data() const; - - /** - * Build the DER encoded certifcate body of an object - * @param tbs the data to be signed - * @result the correctly encoded body of the object - */ - static std::vector<byte> build_cert_body(const std::vector<byte>& tbs); - - /** - * Create a signed generalized CVC object. - * @param signer the signer used to sign this object - * @param tbs_bits the body the generalized CVC object to be signed - * @param rng a random number generator - * @result the DER encoded signed generalized CVC object - */ - static std::vector<byte> make_signed( - PK_Signer& signer, - const std::vector<byte>& tbs_bits, - RandomNumberGenerator& rng); - - EAC1_1_gen_CVC() { m_pk = nullptr; } - - virtual ~EAC1_1_gen_CVC<Derived>() - { delete m_pk; } - - protected: - ECDSA_PublicKey* m_pk; - ASN1_Chr m_chr; - bool m_self_signed; - - static void decode_info(DataSource& source, - std::vector<byte> & res_tbs_bits, - ECDSA_Signature & res_sig); - - }; - -template<typename Derived> ASN1_Chr EAC1_1_gen_CVC<Derived>::get_chr() const - { - return m_chr; - } - -template<typename Derived> bool EAC1_1_gen_CVC<Derived>::is_self_signed() const - { - return m_self_signed; - } - -template<typename Derived> -std::vector<byte> EAC1_1_gen_CVC<Derived>::make_signed( - PK_Signer& signer, - const std::vector<byte>& tbs_bits, - RandomNumberGenerator& rng) // static - { - const auto concat_sig = signer.sign_message(tbs_bits, rng); - - return DER_Encoder() - .start_cons(ASN1_Tag(33), APPLICATION) - .raw_bytes(tbs_bits) - .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons() - .get_contents_unlocked(); - } - -template<typename Derived> -Public_Key* EAC1_1_gen_CVC<Derived>::subject_public_key() const - { - return new ECDSA_PublicKey(*m_pk); - } - -template<typename Derived> std::vector<byte> EAC1_1_gen_CVC<Derived>::build_cert_body(const std::vector<byte>& tbs) - { - return DER_Encoder() - .start_cons(ASN1_Tag(78), APPLICATION) - .raw_bytes(tbs) - .end_cons().get_contents_unlocked(); - } - -template<typename Derived> std::vector<byte> EAC1_1_gen_CVC<Derived>::tbs_data() const - { - return build_cert_body(EAC1_1_obj<Derived>::m_tbs_bits); - } - -template<typename Derived> void EAC1_1_gen_CVC<Derived>::encode(Pipe& out, X509_Encoding encoding) const - { - std::vector<byte> concat_sig(EAC1_1_obj<Derived>::m_sig.get_concatenation()); - std::vector<byte> der = DER_Encoder() - .start_cons(ASN1_Tag(33), APPLICATION) - .start_cons(ASN1_Tag(78), APPLICATION) - .raw_bytes(EAC1_1_obj<Derived>::m_tbs_bits) - .end_cons() - .encode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons() - .get_contents_unlocked(); - - if (encoding == PEM) - throw Invalid_Argument("EAC1_1_gen_CVC::encode() cannot PEM encode an EAC object"); - else - out.write(der); - } - -template<typename Derived> -void EAC1_1_gen_CVC<Derived>::decode_info( - DataSource& source, - std::vector<byte> & res_tbs_bits, - ECDSA_Signature & res_sig) - { - std::vector<byte> concat_sig; - BER_Decoder(source) - .start_cons(ASN1_Tag(33)) - .start_cons(ASN1_Tag(78)) - .raw_bytes(res_tbs_bits) - .end_cons() - .decode(concat_sig, OCTET_STRING, ASN1_Tag(55), APPLICATION) - .end_cons(); - res_sig = decode_concatenation(concat_sig); - } - -} - -#endif - - diff --git a/src/lib/cert/cvc/cvc_req.cpp b/src/lib/cert/cvc/cvc_req.cpp deleted file mode 100644 index 1cb6b50ac..000000000 --- a/src/lib/cert/cvc/cvc_req.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* -* (C) 2007 FlexSecure GmbH -* 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/cvc_req.h> -#include <botan/cvc_cert.h> -#include <botan/ber_dec.h> - -namespace Botan { - -bool EAC1_1_Req::operator==(EAC1_1_Req const& rhs) const - { - return (this->tbs_data() == rhs.tbs_data() && - this->get_concat_sig() == rhs.get_concat_sig()); - } - -void EAC1_1_Req::force_decode() - { - std::vector<byte> enc_pk; - BER_Decoder tbs_cert(m_tbs_bits); - size_t cpi; - tbs_cert.decode(cpi, ASN1_Tag(41), APPLICATION) - .start_cons(ASN1_Tag(73)) - .raw_bytes(enc_pk) - .end_cons() - .decode(m_chr) - .verify_end(); - - if(cpi != 0) - throw Decoding_Error("EAC1_1 requests cpi was not 0"); - - m_pk = decode_eac1_1_key(enc_pk, m_sig_algo); - } - -EAC1_1_Req::EAC1_1_Req(DataSource& in) - { - init(in); - m_self_signed = true; - do_decode(); - } - -EAC1_1_Req::EAC1_1_Req(const std::string& in) - { - DataSource_Stream stream(in, true); - init(stream); - m_self_signed = true; - do_decode(); - } - -} diff --git a/src/lib/cert/cvc/cvc_req.h b/src/lib/cert/cvc/cvc_req.h deleted file mode 100644 index b71a8e764..000000000 --- a/src/lib/cert/cvc/cvc_req.h +++ /dev/null @@ -1,59 +0,0 @@ -/* -* EAC1_1 CVC Request -* (C) 2008 Falko Strenzke -* 2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_CVC_REQ_H__ -#define BOTAN_EAC_CVC_REQ_H__ - -#include <botan/cvc_gen_cert.h> - -namespace Botan { - -/** -* This class represents TR03110 v1.1 EAC CV Certificate Requests. -*/ -class BOTAN_DLL EAC1_1_Req : public EAC1_1_gen_CVC<EAC1_1_Req> - { - public: - friend class EAC1_1_ADO; - friend class EAC1_1_obj<EAC1_1_Req>; - - /** - * Compare for equality with other - * @param other compare for equality with this object - */ - bool operator==(const EAC1_1_Req& other) const; - - /** - * Construct a CVC request from a data source. - * @param source the data source - */ - EAC1_1_Req(DataSource& source); - - /** - * Construct a CVC request from a DER encoded CVC request file. - * @param str the path to the DER encoded file - */ - EAC1_1_Req(const std::string& str); - - virtual ~EAC1_1_Req(){} - private: - void force_decode(); - EAC1_1_Req() {} - }; - -/* -* Comparison Operator -*/ -inline bool operator!=(EAC1_1_Req const& lhs, EAC1_1_Req const& rhs) - { - return !(lhs == rhs); - } - -} - -#endif diff --git a/src/lib/cert/cvc/cvc_self.cpp b/src/lib/cert/cvc/cvc_self.cpp deleted file mode 100644 index fdc66bbfd..000000000 --- a/src/lib/cert/cvc/cvc_self.cpp +++ /dev/null @@ -1,339 +0,0 @@ -/* -* (C) 2007 FlexSecure GmbH -* 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/cvc_self.h> -#include <botan/ecc_key.h> -#include <botan/point_gfp.h> -#include <botan/oids.h> -#include <sstream> - -namespace Botan { - -namespace { - -/* -* cvc CHAT values -*/ -enum CHAT_values{ - CVCA = 0xC0, - DVCA_domestic = 0x80, - DVCA_foreign = 0x40, - IS = 0x00, - - IRIS = 0x02, - FINGERPRINT = 0x01 -}; - -void encode_eac_bigint(DER_Encoder& der, const BigInt& x, ASN1_Tag tag) - { - der.encode(BigInt::encode_1363(x, x.bytes()), OCTET_STRING, tag); - } - -std::vector<byte> eac_1_1_encoding(const EC_PublicKey* key, - const OID& sig_algo) - { - if(key->domain_format() == EC_DOMPAR_ENC_OID) - throw Encoding_Error("CVC encoder: cannot encode parameters by OID"); - - const EC_Group& domain = key->domain(); - - // This is why we can't have nice things - - DER_Encoder enc; - enc.start_cons(ASN1_Tag(73), APPLICATION) - .encode(sig_algo); - - if(key->domain_format() == EC_DOMPAR_ENC_EXPLICIT) - { - encode_eac_bigint(enc, domain.get_curve().get_p(), ASN1_Tag(1)); - encode_eac_bigint(enc, domain.get_curve().get_a(), ASN1_Tag(2)); - encode_eac_bigint(enc, domain.get_curve().get_b(), ASN1_Tag(3)); - - enc.encode(EC2OSP(domain.get_base_point(), PointGFp::UNCOMPRESSED), - OCTET_STRING, ASN1_Tag(4)); - - encode_eac_bigint(enc, domain.get_order(), ASN1_Tag(4)); - } - - enc.encode(EC2OSP(key->public_point(), PointGFp::UNCOMPRESSED), - OCTET_STRING, ASN1_Tag(6)); - - if(key->domain_format() == EC_DOMPAR_ENC_EXPLICIT) - encode_eac_bigint(enc, domain.get_cofactor(), ASN1_Tag(7)); - - enc.end_cons(); - - return enc.get_contents_unlocked(); - } - -std::string padding_and_hash_from_oid(OID const& oid) - { - std::string padding_and_hash = OIDS::lookup(oid); // use the hash - - if(padding_and_hash.substr(0,6) != "ECDSA/") - throw Invalid_State("CVC: Can only use ECDSA, not " + padding_and_hash); - - padding_and_hash.erase(0, padding_and_hash.find("/") + 1); - return padding_and_hash; - } - -} - -namespace CVC_EAC { - -EAC1_1_CVC create_self_signed_cert(Private_Key const& key, - EAC1_1_CVC_Options const& opt, - RandomNumberGenerator& rng) - { - // NOTE: we ignore the value of opt.chr - - const ECDSA_PrivateKey* priv_key = dynamic_cast<const ECDSA_PrivateKey*>(&key); - - if(priv_key == 0) - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - - ASN1_Chr chr(opt.car.value()); - - AlgorithmIdentifier sig_algo; - std::string padding_and_hash("EMSA1_BSI(" + opt.hash_alg + ")"); - sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); - sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); - - PK_Signer signer(*priv_key, padding_and_hash); - - std::vector<byte> enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); - - return make_cvc_cert(signer, - enc_public_key, - opt.car, chr, - opt.holder_auth_templ, - opt.ced, opt.cex, rng); - } - -EAC1_1_Req create_cvc_req(Private_Key const& key, - ASN1_Chr const& chr, - std::string const& hash_alg, - RandomNumberGenerator& rng) - { - - ECDSA_PrivateKey const* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&key); - if (priv_key == 0) - { - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - } - AlgorithmIdentifier sig_algo; - std::string padding_and_hash("EMSA1_BSI(" + hash_alg + ")"); - sig_algo.oid = OIDS::lookup(priv_key->algo_name() + "/" + padding_and_hash); - sig_algo = AlgorithmIdentifier(sig_algo.oid, AlgorithmIdentifier::USE_NULL_PARAM); - - PK_Signer signer(*priv_key, padding_and_hash); - - std::vector<byte> enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); - - std::vector<byte> enc_cpi; - enc_cpi.push_back(0x00); - std::vector<byte> tbs = DER_Encoder() - .encode(enc_cpi, OCTET_STRING, ASN1_Tag(41), APPLICATION) - .raw_bytes(enc_public_key) - .encode(chr) - .get_contents_unlocked(); - - std::vector<byte> signed_cert = - EAC1_1_gen_CVC<EAC1_1_Req>::make_signed(signer, - EAC1_1_gen_CVC<EAC1_1_Req>::build_cert_body(tbs), - rng); - - DataSource_Memory source(signed_cert); - return EAC1_1_Req(source); - } - -EAC1_1_ADO create_ado_req(Private_Key const& key, - EAC1_1_Req const& req, - ASN1_Car const& car, - RandomNumberGenerator& rng) - { - - ECDSA_PrivateKey const* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&key); - if (priv_key == 0) - { - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - } - - std::string padding_and_hash = padding_and_hash_from_oid(req.signature_algorithm().oid); - PK_Signer signer(*priv_key, padding_and_hash); - std::vector<byte> tbs_bits = req.BER_encode(); - tbs_bits += DER_Encoder().encode(car).get_contents(); - - std::vector<byte> signed_cert = - EAC1_1_ADO::make_signed(signer, tbs_bits, rng); - - DataSource_Memory source(signed_cert); - return EAC1_1_ADO(source); - } - -} // namespace CVC_EAC -namespace DE_EAC -{ - -EAC1_1_CVC create_cvca(Private_Key const& key, - std::string const& hash, - ASN1_Car const& car, bool iris, bool fingerpr, - u32bit cvca_validity_months, - RandomNumberGenerator& rng) - { - ECDSA_PrivateKey const* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&key); - if (priv_key == 0) - { - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - } - EAC1_1_CVC_Options opts; - opts.car = car; - - opts.ced = ASN1_Ced(std::chrono::system_clock::now()); - opts.cex = ASN1_Cex(opts.ced); - opts.cex.add_months(cvca_validity_months); - opts.holder_auth_templ = (CVCA | (iris * IRIS) | (fingerpr * FINGERPRINT)); - opts.hash_alg = hash; - return CVC_EAC::create_self_signed_cert(*priv_key, opts, rng); - } - - - -EAC1_1_CVC link_cvca(EAC1_1_CVC const& signer, - Private_Key const& key, - EAC1_1_CVC const& signee, - RandomNumberGenerator& rng) - { - const ECDSA_PrivateKey* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&key); - - if (priv_key == 0) - throw Invalid_Argument("link_cvca(): unsupported key type"); - - ASN1_Ced ced(std::chrono::system_clock::now()); - ASN1_Cex cex(signee.get_cex()); - if (*static_cast<EAC_Time*>(&ced) > *static_cast<EAC_Time*>(&cex)) - { - std::string detail("link_cvca(): validity periods of provided certificates don't overlap: currend time = ced = "); - detail += ced.as_string(); - detail += ", signee.cex = "; - detail += cex.as_string(); - throw Invalid_Argument(detail); - } - if (signer.signature_algorithm() != signee.signature_algorithm()) - { - throw Invalid_Argument("link_cvca(): signature algorithms of signer and signee don't match"); - } - AlgorithmIdentifier sig_algo = signer.signature_algorithm(); - std::string padding_and_hash = padding_and_hash_from_oid(sig_algo.oid); - PK_Signer pk_signer(*priv_key, padding_and_hash); - std::unique_ptr<Public_Key> pk(signee.subject_public_key()); - ECDSA_PublicKey* subj_pk = dynamic_cast<ECDSA_PublicKey*>(pk.get()); - subj_pk->set_parameter_encoding(EC_DOMPAR_ENC_EXPLICIT); - - std::vector<byte> enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); - - return make_cvc_cert(pk_signer, enc_public_key, - signer.get_car(), - signee.get_chr(), - signer.get_chat_value(), - ced, cex, - rng); - } - -EAC1_1_CVC sign_request(EAC1_1_CVC const& signer_cert, - Private_Key const& key, - EAC1_1_Req const& signee, - u32bit seqnr, - u32bit seqnr_len, - bool domestic, - u32bit dvca_validity_months, - u32bit ca_is_validity_months, - RandomNumberGenerator& rng) - { - ECDSA_PrivateKey const* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&key); - if (priv_key == 0) - { - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - } - std::string chr_str = signee.get_chr().value(); - - std::string seqnr_string = std::to_string(seqnr); - - while(seqnr_string.size() < seqnr_len) - seqnr_string = '0' + seqnr_string; - - chr_str += seqnr_string; - ASN1_Chr chr(chr_str); - std::string padding_and_hash = padding_and_hash_from_oid(signee.signature_algorithm().oid); - PK_Signer pk_signer(*priv_key, padding_and_hash); - std::unique_ptr<Public_Key> pk(signee.subject_public_key()); - ECDSA_PublicKey* subj_pk = dynamic_cast<ECDSA_PublicKey*>(pk.get()); - std::unique_ptr<Public_Key> signer_pk(signer_cert.subject_public_key()); - - // for the case that the domain parameters are not set... - // (we use those from the signer because they must fit) - //subj_pk->set_domain_parameters(priv_key->domain_parameters()); - - subj_pk->set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - - AlgorithmIdentifier sig_algo(signer_cert.signature_algorithm()); - - ASN1_Ced ced(std::chrono::system_clock::now()); - - u32bit chat_val; - u32bit chat_low = signer_cert.get_chat_value() & 0x3; // take the chat rights from signer - ASN1_Cex cex(ced); - if ((signer_cert.get_chat_value() & CVCA) == CVCA) - { - // we sign a dvca - cex.add_months(dvca_validity_months); - if (domestic) - chat_val = DVCA_domestic | chat_low; - else - chat_val = DVCA_foreign | chat_low; - } - else if ((signer_cert.get_chat_value() & DVCA_domestic) == DVCA_domestic || - (signer_cert.get_chat_value() & DVCA_foreign) == DVCA_foreign) - { - cex.add_months(ca_is_validity_months); - chat_val = IS | chat_low; - } - else - { - throw Invalid_Argument("sign_request(): encountered illegal value for CHAT"); - // (IS cannot sign certificates) - } - - std::vector<byte> enc_public_key = eac_1_1_encoding(priv_key, sig_algo.oid); - - return make_cvc_cert(pk_signer, enc_public_key, - ASN1_Car(signer_cert.get_chr().iso_8859()), - chr, - chat_val, - ced, - cex, - rng); - } - -EAC1_1_Req create_cvc_req(Private_Key const& prkey, - ASN1_Chr const& chr, - std::string const& hash_alg, - RandomNumberGenerator& rng) - { - ECDSA_PrivateKey const* priv_key = dynamic_cast<ECDSA_PrivateKey const*>(&prkey); - if (priv_key == 0) - { - throw Invalid_Argument("CVC_EAC::create_self_signed_cert(): unsupported key type"); - } - ECDSA_PrivateKey key(*priv_key); - key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - return CVC_EAC::create_cvc_req(key, chr, hash_alg, rng); - } - -} // namespace DE_EAC - -} diff --git a/src/lib/cert/cvc/cvc_self.h b/src/lib/cert/cvc/cvc_self.h deleted file mode 100644 index d56e96c40..000000000 --- a/src/lib/cert/cvc/cvc_self.h +++ /dev/null @@ -1,180 +0,0 @@ -/* -* CVC Self-Signed Certificate -* (C) 2007 FlexSecure GmbH -* 2008 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_CVC_EAC_SELF_H__ -#define BOTAN_CVC_EAC_SELF_H__ - -#include <botan/cvc_cert.h> -#include <botan/ecdsa.h> -#include <botan/asn1_obj.h> -#include <botan/cvc_req.h> -#include <botan/cvc_ado.h> - -namespace Botan { - -/** -* This class represents a set of options used for the creation of CVC certificates -*/ -class BOTAN_DLL EAC1_1_CVC_Options - { - public: - - // public member variable: - ASN1_Car car; - - // public member variable: - ASN1_Chr chr; - - // public member variable: - byte holder_auth_templ; - - // public member variable: - ASN1_Ced ced; - - // public member variable: - ASN1_Cex cex; - - // public member variable: - std::string hash_alg; - }; - -/** -* This namespace represents general EAC 1.1 convenience functions. -*/ -namespace CVC_EAC { - -/** -* Create a selfsigned CVCA -* @param rng the rng to use -* @param key the ECDSA private key to be used to sign the certificate -* @param opts used to set several parameters. Necessary are: -* car, holder_auth_templ, hash_alg, ced, cex and hash_alg -* @result the self signed certificate -*/ - -EAC1_1_CVC BOTAN_DLL create_self_signed_cert(Private_Key const& key, - EAC1_1_CVC_Options const& opts, - RandomNumberGenerator& rng); -/** -* Create a CVC request. The key encoding will be according to the provided private key. -* @param priv_key the private key associated with the requesting entity -* @param chr the chr to appear in the certificate (to be provided without -* sequence number) -* @param hash_alg the string defining the hash algorithm to be used for the creation -* of the signature -* @param rng the rng to use -* @result the new request -*/ -EAC1_1_Req BOTAN_DLL create_cvc_req(Private_Key const& priv_key, - ASN1_Chr const& chr, - std::string const& hash_alg, - RandomNumberGenerator& rng); - -/** -* Create an ADO from a request object. -* @param priv_key the private key used to sign the ADO -* @param req the request forming the body of the ADO -* @param car the CAR forming the body of the ADO, i.e. the -* CHR of the entity associated with the provided private key -* @param rng the rng to use -*/ -EAC1_1_ADO BOTAN_DLL create_ado_req(Private_Key const& priv_key, - EAC1_1_Req const& req, - ASN1_Car const& car, - RandomNumberGenerator& rng); -} -/** -* This namespace represents EAC 1.1 CVC convenience functions -* following the specific german requirements. -*/ - -namespace DE_EAC { - -/** -* Create a CVCA certificate. -* @param priv_key the private key associated with the CVCA certificate -* to be created -* @param hash the string identifying the hash algorithm to be used -* for signing the certificate to be created -* @param car the CAR of the certificate to be created -* @param iris indicates whether the entity associated with the certificate -* shall be entitled to read the biometrical iris image -* @param fingerpr indicates whether the entity associated with the certificate -* shall be entitled to read the biometrical fingerprint image -* @param cvca_validity_months length of time in months this will be valid -* @param rng a random number generator -* @result the CVCA certificate created -*/ -EAC1_1_CVC BOTAN_DLL create_cvca(Private_Key const& priv_key, - std::string const& hash, - ASN1_Car const& car, - bool iris, - bool fingerpr, - u32bit cvca_validity_months, - RandomNumberGenerator& rng); - -/** -* Create a link certificate between two CVCA certificates. The key -* encoding will be implicitCA. -* @param signer the cvca certificate associated with the signing -* entity -* @param priv_key the private key associated with the signer -* @param to_be_signed the certificate which whose CAR/CHR will be -* the holder of the link certificate -* @param rng a random number generator -*/ -EAC1_1_CVC BOTAN_DLL link_cvca(EAC1_1_CVC const& signer, - Private_Key const& priv_key, - EAC1_1_CVC const& to_be_signed, - RandomNumberGenerator& rng); - -/** -* Create a CVC request. The key encoding will be implicitCA. -* @param priv_key the private key associated with the requesting entity -* @param chr the chr to appear in the certificate (to be provided without -* sequence number) -* @param hash_alg the string defining the hash algorithm to be used for the creation -* of the signature -* @param rng a random number generator -* @result the new request -*/ -EAC1_1_Req BOTAN_DLL create_cvc_req(Private_Key const& priv_key, - ASN1_Chr const& chr, - std::string const& hash_alg, - RandomNumberGenerator& rng); - -/** -* Sign a CVC request. -* @param signer_cert the certificate of the signing entity -* @param priv_key the private key of the signing entity -* @param req the request to be signed -* @param seqnr the sequence number of the certificate to be created -* @param seqnr_len the number of digits the sequence number will be -* encoded in -* @param domestic indicates whether to sign a domestic or a foreign -* certificate: set to true for domestic -* @param dvca_validity_months validity period in months -* @param ca_is_validity_months validity period in months -* @param rng a random number generator -* @result the new certificate -* -**/ -EAC1_1_CVC BOTAN_DLL sign_request(EAC1_1_CVC const& signer_cert, - Private_Key const& priv_key, - EAC1_1_Req const& req, - u32bit seqnr, - u32bit seqnr_len, - bool domestic, - u32bit dvca_validity_months, - u32bit ca_is_validity_months, - RandomNumberGenerator& rng); -} - -} - -#endif diff --git a/src/lib/cert/cvc/eac_asn_obj.h b/src/lib/cert/cvc/eac_asn_obj.h deleted file mode 100644 index b4dcb6342..000000000 --- a/src/lib/cert/cvc/eac_asn_obj.h +++ /dev/null @@ -1,239 +0,0 @@ -/* -* EAC ASN.1 Objects -* (C) 2007-2008 FlexSecure GmbH -* 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_ASN1_OBJ_H__ -#define BOTAN_EAC_ASN1_OBJ_H__ - -#include <botan/asn1_obj.h> -#include <chrono> - -namespace Botan { - -/** -* This class represents CVC EAC Time objects. -* It only models year, month and day. Only limited sanity checks of -* the inputted date value are performed. -*/ -class BOTAN_DLL EAC_Time : public ASN1_Object - { - public: - void encode_into(class DER_Encoder&) const; - void decode_from(class BER_Decoder&); - - /** - * Get a this objects value as a string. - * @return date string - */ - std::string as_string() const; - - /** - * Get a this objects value as a readable formatted string. - * @return date string - */ - std::string readable_string() const; - - /** - * Find out whether this object's values have been set. - * @return true if this object's internal values are set - */ - bool time_is_set() const; - - /** - * Compare this to another EAC_Time object. - * @return -1 if this object's date is earlier than - * other, +1 in the opposite case, and 0 if both dates are - * equal. - */ - s32bit cmp(const EAC_Time& other) const; - - /** - * Set this' value by a string value. - * @param str a string in the format "yyyy mm dd", - * e.g. "2007 08 01" - */ - void set_to(const std::string& str); - - /** - * Add the specified number of years to this. - * @param years the number of years to add - */ - void add_years(u32bit years); - - /** - * Add the specified number of months to this. - * @param months the number of months to add - */ - void add_months(u32bit months); - - /** - * Get the year value of this objects. - * @return year value - */ - u32bit get_year() const { return m_year; } - - /** - * Get the month value of this objects. - * @return month value - */ - u32bit get_month() const { return m_month; } - - /** - * Get the day value of this objects. - * @return day value - */ - u32bit get_day() const { return m_day; } - - EAC_Time(const std::chrono::system_clock::time_point& time, - ASN1_Tag tag = ASN1_Tag(0)); - - EAC_Time(const std::string& yyyy_mm_dd, - ASN1_Tag tag = ASN1_Tag(0)); - - EAC_Time(u32bit year, u32bit month, u32bit day, - ASN1_Tag tag = ASN1_Tag(0)); - - virtual ~EAC_Time() {} - private: - std::vector<byte> encoded_eac_time() const; - bool passes_sanity_check() const; - u32bit m_year, m_month, m_day; - ASN1_Tag m_tag; - }; - -/** -* This class represents CVC CEDs. Only limited sanity checks of -* the inputted date value are performed. -*/ -class BOTAN_DLL ASN1_Ced : public EAC_Time - { - public: - /** - * Construct a CED from a string value. - * @param str a string in the format "yyyy mm dd", - * e.g. "2007 08 01" - */ - ASN1_Ced(const std::string& str = "") : - EAC_Time(str, ASN1_Tag(37)) {} - - /** - * Construct a CED from a time point - */ - ASN1_Ced(const std::chrono::system_clock::time_point& time) : - EAC_Time(time, ASN1_Tag(37)) {} - - /** - * Copy constructor (for general EAC_Time objects). - * @param other the object to copy from - */ - ASN1_Ced(const EAC_Time& other) : - EAC_Time(other.get_year(), other.get_month(), other.get_day(), - ASN1_Tag(37)) - {} - }; - -/** -* This class represents CVC CEXs. Only limited sanity checks of -* the inputted date value are performed. -*/ -class BOTAN_DLL ASN1_Cex : public EAC_Time - { - public: - /** - * Construct a CEX from a string value. - * @param str a string in the format "yyyy mm dd", - * e.g. "2007 08 01" - */ - ASN1_Cex(const std::string& str = "") : - EAC_Time(str, ASN1_Tag(36)) {} - - ASN1_Cex(const std::chrono::system_clock::time_point& time) : - EAC_Time(time, ASN1_Tag(36)) {} - - ASN1_Cex(const EAC_Time& other) : - EAC_Time(other.get_year(), other.get_month(), other.get_day(), - ASN1_Tag(36)) - {} - }; - -/** -* Base class for car/chr of cv certificates. -*/ -class BOTAN_DLL ASN1_EAC_String: public ASN1_Object - { - public: - void encode_into(class DER_Encoder&) const; - void decode_from(class BER_Decoder&); - - /** - * Get this objects string value. - * @return string value - */ - std::string value() const; - - /** - * Get this objects string value. - * @return string value in iso8859 encoding - */ - std::string iso_8859() const; - - ASN1_Tag tagging() const; - ASN1_EAC_String(const std::string& str, ASN1_Tag the_tag); - - virtual ~ASN1_EAC_String() {} - protected: - bool sanity_check() const; - private: - std::string m_iso_8859_str; - ASN1_Tag m_tag; - }; - -/** -* This class represents CARs of CVCs. (String tagged with 2) -*/ -class BOTAN_DLL ASN1_Car : public ASN1_EAC_String - { - public: - /** - * Create a CAR with the specified content. - * @param str the CAR value - */ - ASN1_Car(std::string const& str = ""); - }; - -/** -* This class represents CHRs of CVCs (tag 32) -*/ -class BOTAN_DLL ASN1_Chr : public ASN1_EAC_String - { - public: - /** - * Create a CHR with the specified content. - * @param str the CHR value - */ - ASN1_Chr(std::string const& str = ""); - }; - -/* -* Comparison Operations -*/ -bool BOTAN_DLL operator==(const EAC_Time&, const EAC_Time&); -bool BOTAN_DLL operator!=(const EAC_Time&, const EAC_Time&); -bool BOTAN_DLL operator<=(const EAC_Time&, const EAC_Time&); -bool BOTAN_DLL operator>=(const EAC_Time&, const EAC_Time&); -bool BOTAN_DLL operator>(const EAC_Time&, const EAC_Time&); -bool BOTAN_DLL operator<(const EAC_Time&, const EAC_Time&); - -bool BOTAN_DLL operator==(const ASN1_EAC_String&, const ASN1_EAC_String&); -inline bool operator!=(const ASN1_EAC_String& lhs, const ASN1_EAC_String& rhs) - { - return !(lhs == rhs); - } - -} - -#endif diff --git a/src/lib/cert/cvc/eac_obj.h b/src/lib/cert/cvc/eac_obj.h deleted file mode 100644 index a6e676076..000000000 --- a/src/lib/cert/cvc/eac_obj.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -* EAC1_1 objects -* (C) 2008 Falko Strenzke -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_OBJ_H__ -#define BOTAN_EAC_OBJ_H__ - -#include <botan/signed_obj.h> -#include <botan/ecdsa_sig.h> - -namespace Botan { - -/** -* TR03110 v1.1 EAC CV Certificate -*/ -template<typename Derived> // CRTP is used enable the call sequence: -class EAC1_1_obj : public EAC_Signed_Object - { - public: - /** - * Return the signature as a concatenation of the encoded parts. - * @result the concatenated signature - */ - std::vector<byte> get_concat_sig() const - { return m_sig.get_concatenation(); } - - bool check_signature(class Public_Key& key) const - { - return EAC_Signed_Object::check_signature(key, m_sig.DER_encode()); - } - - protected: - ECDSA_Signature m_sig; - - void init(DataSource& in) - { - try - { - Derived::decode_info(in, m_tbs_bits, m_sig); - } - catch(Decoding_Error) - { - throw Decoding_Error(m_PEM_label_pref + " decoding failed"); - } - } - - virtual ~EAC1_1_obj<Derived>(){} - }; - -} - -#endif diff --git a/src/lib/cert/cvc/ecdsa_sig.cpp b/src/lib/cert/cvc/ecdsa_sig.cpp deleted file mode 100644 index 5e85d7932..000000000 --- a/src/lib/cert/cvc/ecdsa_sig.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/* -* ECDSA Signature -* (C) 2007 Falko Strenzke, FlexSecure GmbH -* (C) 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/ecdsa_sig.h> - -namespace Botan { - -ECDSA_Signature::ECDSA_Signature(const std::vector<byte>& ber) - { - BER_Decoder(ber) - .start_cons(SEQUENCE) - .decode(m_r) - .decode(m_s) - .end_cons() - .verify_end(); - } - -std::vector<byte> ECDSA_Signature::DER_encode() const - { - return DER_Encoder() - .start_cons(SEQUENCE) - .encode(get_r()) - .encode(get_s()) - .end_cons() - .get_contents_unlocked(); - } - -std::vector<byte> ECDSA_Signature::get_concatenation() const - { - // use the larger - const size_t enc_len = m_r > m_s ? m_r.bytes() : m_s.bytes(); - - const auto sv_r = BigInt::encode_1363(m_r, enc_len); - const auto sv_s = BigInt::encode_1363(m_s, enc_len); - - secure_vector<byte> result(sv_r); - result += sv_s; - return unlock(result); - } - -ECDSA_Signature decode_concatenation(const std::vector<byte>& concat) - { - if(concat.size() % 2 != 0) - throw Invalid_Argument("Erroneous length of signature"); - - const size_t rs_len = concat.size() / 2; - - BigInt r = BigInt::decode(&concat[0], rs_len); - BigInt s = BigInt::decode(&concat[rs_len], rs_len); - - return ECDSA_Signature(r, s); - } - -} diff --git a/src/lib/cert/cvc/ecdsa_sig.h b/src/lib/cert/cvc/ecdsa_sig.h deleted file mode 100644 index 2845cbec9..000000000 --- a/src/lib/cert/cvc/ecdsa_sig.h +++ /dev/null @@ -1,61 +0,0 @@ -/* -* ECDSA Signature -* (C) 2007 Falko Strenzke, FlexSecure GmbH -* (C) 2008-2010 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_ECDSA_SIGNATURE_H__ -#define BOTAN_ECDSA_SIGNATURE_H__ - -#include <botan/bigint.h> -#include <botan/der_enc.h> -#include <botan/ber_dec.h> - -namespace Botan { - -/** -* Class representing an ECDSA signature -*/ -class BOTAN_DLL ECDSA_Signature - { - public: - friend class ECDSA_Signature_Decoder; - - ECDSA_Signature() {} - ECDSA_Signature(const BigInt& r, const BigInt& s) : - m_r(r), m_s(s) {} - - ECDSA_Signature(const std::vector<byte>& ber); - - const BigInt& get_r() const { return m_r; } - const BigInt& get_s() const { return m_s; } - - /** - * return the r||s - */ - std::vector<byte> get_concatenation() const; - - std::vector<byte> DER_encode() const; - - bool operator==(const ECDSA_Signature& other) const - { - return (get_r() == other.get_r() && get_s() == other.get_s()); - } - - private: - BigInt m_r; - BigInt m_s; - }; - -inline bool operator!=(const ECDSA_Signature& lhs, const ECDSA_Signature& rhs) - { - return !(lhs == rhs); - } - -ECDSA_Signature decode_concatenation(const std::vector<byte>& concatenation); - -} - -#endif diff --git a/src/lib/cert/cvc/info.txt b/src/lib/cert/cvc/info.txt deleted file mode 100644 index e3da5435e..000000000 --- a/src/lib/cert/cvc/info.txt +++ /dev/null @@ -1,35 +0,0 @@ -define CARD_VERIFIABLE_CERTIFICATES 20131128 -load_on request - -<header:public> -cvc_ado.h -cvc_cert.h -cvc_gen_cert.h -cvc_req.h -cvc_self.h -eac_asn_obj.h -eac_obj.h -ecdsa_sig.h -signed_obj.h -</header:public> - -<source> -asn1_eac_str.cpp -asn1_eac_tm.cpp -ecdsa_sig.cpp -cvc_ado.cpp -cvc_cert.cpp -cvc_req.cpp -cvc_self.cpp -signed_obj.cpp -</source> - -<requires> -asn1 -bigint -ecdsa -filters -oid_lookup -pem -pubkey -</requires> diff --git a/src/lib/cert/cvc/signed_obj.cpp b/src/lib/cert/cvc/signed_obj.cpp deleted file mode 100644 index 1e3849663..000000000 --- a/src/lib/cert/cvc/signed_obj.cpp +++ /dev/null @@ -1,95 +0,0 @@ -/* -* EAC SIGNED Object -* (C) 1999-2010 Jack Lloyd -* 2007 FlexSecure GmbH -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/signed_obj.h> -#include <botan/pubkey.h> -#include <botan/oids.h> - -namespace Botan { - -/* -* Return a BER encoded X.509 object -*/ -std::vector<byte> EAC_Signed_Object::BER_encode() const - { - Pipe ber; - ber.start_msg(); - encode(ber, RAW_BER); - ber.end_msg(); - return unlock(ber.read_all()); - } - -/* -* Return a PEM encoded X.509 object -*/ -std::string EAC_Signed_Object::PEM_encode() const - { - Pipe pem; - pem.start_msg(); - encode(pem, PEM); - pem.end_msg(); - return pem.read_all_as_string(); - } - -/* -* Return the algorithm used to sign this object -*/ -AlgorithmIdentifier EAC_Signed_Object::signature_algorithm() const - { - return m_sig_algo; - } - -bool EAC_Signed_Object::check_signature(Public_Key& pub_key, - const std::vector<byte>& sig) const - { - try - { - std::vector<std::string> sig_info = - split_on(OIDS::lookup(m_sig_algo.oid), '/'); - - if(sig_info.size() != 2 || sig_info[0] != pub_key.algo_name()) - { - return false; - } - - std::string padding = sig_info[1]; - Signature_Format format = - (pub_key.message_parts() >= 2) ? DER_SEQUENCE : IEEE_1363; - - std::vector<byte> to_sign = tbs_data(); - - PK_Verifier verifier(pub_key, padding, format); - return verifier.verify_message(to_sign, sig); - } - catch(...) - { - return false; - } - } - -/* -* Try to decode the actual information -*/ -void EAC_Signed_Object::do_decode() - { - try { - force_decode(); - } - catch(Decoding_Error& e) - { - const std::string what = e.what(); - throw Decoding_Error(m_PEM_label_pref + " decoding failed (" + what + ")"); - } - catch(Invalid_Argument& e) - { - const std::string what = e.what(); - throw Decoding_Error(m_PEM_label_pref + " decoding failed (" + what + ")"); - } - } - -} diff --git a/src/lib/cert/cvc/signed_obj.h b/src/lib/cert/cvc/signed_obj.h deleted file mode 100644 index b3fe20f31..000000000 --- a/src/lib/cert/cvc/signed_obj.h +++ /dev/null @@ -1,95 +0,0 @@ -/* -* EAC SIGNED Object -* (C) 2007 FlexSecure GmbH -* 2008 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EAC_SIGNED_OBJECT_H__ -#define BOTAN_EAC_SIGNED_OBJECT_H__ - -#include <botan/asn1_obj.h> -#include <botan/x509_key.h> -#include <botan/pipe.h> -#include <vector> - -namespace Botan { - -/** -* This class represents abstract signed EAC object -*/ -class BOTAN_DLL EAC_Signed_Object - { - public: - /** - * Get the TBS (to-be-signed) data in this object. - * @return DER encoded TBS data of this object - */ - virtual std::vector<byte> tbs_data() const = 0; - - /** - * Get the signature of this object as a concatenation, i.e. if the - * signature consists of multiple parts (like in the case of ECDSA) - * these will be concatenated. - * @return signature as a concatenation of its parts - */ - - /* - NOTE: this is here only because abstract signature objects have - not yet been introduced - */ - virtual std::vector<byte> get_concat_sig() const = 0; - - /** - * Get the signature algorithm identifier used to sign this object. - * @result the signature algorithm identifier - */ - AlgorithmIdentifier signature_algorithm() const; - - /** - * Check the signature of this object. - * @param key the public key associated with this signed object - * @param sig the signature we are checking - * @return true if the signature was created by the private key - * associated with this public key - */ - bool check_signature(class Public_Key& key, - const std::vector<byte>& sig) const; - - /** - * Write this object DER encoded into a specified pipe. - * @param pipe the pipe to write the encoded object to - * @param encoding the encoding type to use - */ - virtual void encode(Pipe& pipe, - X509_Encoding encoding = PEM) const = 0; - - /** - * BER encode this object. - * @return result containing the BER representation of this object. - */ - std::vector<byte> BER_encode() const; - - /** - * PEM encode this object. - * @return result containing the PEM representation of this object. - */ - std::string PEM_encode() const; - - virtual ~EAC_Signed_Object() {} - protected: - void do_decode(); - EAC_Signed_Object() {} - - AlgorithmIdentifier m_sig_algo; - std::vector<byte> m_tbs_bits; - std::string m_PEM_label_pref; - std::vector<std::string> m_PEM_labels_allowed; - private: - virtual void force_decode() = 0; - }; - -} - -#endif diff --git a/src/lib/cert/x509/key_constraint.cpp b/src/lib/cert/x509/key_constraint.cpp index 24791b34a..a90af013c 100644 --- a/src/lib/cert/x509/key_constraint.cpp +++ b/src/lib/cert/x509/key_constraint.cpp @@ -1,69 +1,46 @@ /* * KeyUsage * (C) 1999-2007 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ #include <botan/key_constraint.h> #include <botan/x509_key.h> -#include <botan/ber_dec.h> namespace Botan { -namespace BER { - -/* -* Decode a BER encoded KeyUsage -*/ -void decode(BER_Decoder& source, Key_Constraints& key_usage) - { - BER_Object obj = source.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"); - - const byte mask = (0xFF << obj.value[0]); - obj.value[obj.value.size()-1] &= mask; - - u16bit usage = 0; - for(size_t j = 1; j != obj.value.size(); ++j) - usage = (obj.value[j] << 8) | usage; - - key_usage = Key_Constraints(usage); - } - -} - /* -* Find the allowable key constraints +* Make sure the given key constraints are permitted for the given key type */ -Key_Constraints find_constraints(const Public_Key& pub_key, - Key_Constraints limits) +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 constraints = 0; + size_t permitted = 0; if(name == "DH" || name == "ECDH") - constraints |= KEY_AGREEMENT; + { + permitted |= KEY_AGREEMENT | ENCIPHER_ONLY | DECIPHER_ONLY; + } if(name == "RSA" || name == "ElGamal") - constraints |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT; + { + permitted |= KEY_ENCIPHERMENT | DATA_ENCIPHERMENT; + } if(name == "RSA" || name == "RW" || name == "NR" || - name == "DSA" || name == "ECDSA") - constraints |= DIGITAL_SIGNATURE | NON_REPUDIATION; - - if(limits) - constraints &= limits; - - return Key_Constraints(constraints); + name == "DSA" || name == "ECDSA" || name == "ECGDSA" || name == "ECKCDSA") + { + permitted |= DIGITAL_SIGNATURE | NON_REPUDIATION | KEY_CERT_SIGN | CRL_SIGN; + } + + if ( ( constraints & permitted ) != constraints ) + { + throw Exception("Constraint not permitted for key type " + name); + } } } diff --git a/src/lib/cert/x509/key_constraint.h b/src/lib/cert/x509/key_constraint.h index 179e413b5..b67eb7010 100644 --- a/src/lib/cert/x509/key_constraint.h +++ b/src/lib/cert/x509/key_constraint.h @@ -1,6 +1,7 @@ /* * Enumerations * (C) 1999-2007 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,7 +9,7 @@ #ifndef BOTAN_ENUMS_H__ #define BOTAN_ENUMS_H__ -#include <botan/ber_dec.h> +#include <botan/build.h> namespace Botan { @@ -32,26 +33,13 @@ enum Key_Constraints { class Public_Key; /** -* Create the key constraints for a specific public key. -* @param pub_key the public key from which the basic set of -* constraints to be placed in the return value is derived -* @param limits additional limits that will be incorporated into the -* return value -* @return combination of key type specific constraints and -* additional limits +* 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 constrains the constraints that shall be enforced on the key +* @throw Exception if the given constraints are not permitted for this key */ - -BOTAN_DLL Key_Constraints find_constraints(const Public_Key& pub_key, - Key_Constraints limits); - -/** -* BER Decoding Function for key constraints -*/ -namespace BER { - -void BOTAN_DLL decode(BER_Decoder&, Key_Constraints&); - -} +BOTAN_DLL void verify_cert_constraints_valid_for_key_type(const Public_Key& pub_key, + Key_Constraints constraints); } diff --git a/src/lib/cert/x509/name_constraint.cpp b/src/lib/cert/x509/name_constraint.cpp index a1ed19856..83f6386ba 100644 --- a/src/lib/cert/x509/name_constraint.cpp +++ b/src/lib/cert/x509/name_constraint.cpp @@ -33,7 +33,7 @@ GeneralName::GeneralName(const std::string& v) : GeneralName() void GeneralName::encode_into(class DER_Encoder&) const { - throw Exception("General Name encoding not implemented"); + throw Not_Implemented("GeneralName encoding"); } void GeneralName::decode_from(class BER_Decoder& ber) @@ -249,7 +249,7 @@ GeneralSubtree::GeneralSubtree(const std::string& v) : GeneralSubtree() void GeneralSubtree::encode_into(class DER_Encoder&) const { - throw std::runtime_error("General Subtree encoding not implemented"); + throw Not_Implemented("General Subtree encoding"); } void GeneralSubtree::decode_from(class BER_Decoder& ber) diff --git a/src/lib/cert/x509/ocsp.cpp b/src/lib/cert/x509/ocsp.cpp index 4f4a3aece..df8df3b39 100644 --- a/src/lib/cert/x509/ocsp.cpp +++ b/src/lib/cert/x509/ocsp.cpp @@ -81,7 +81,7 @@ void check_signature(const std::vector<byte>& tbs_response, // Otherwise attempt to chain the signing cert to a trust root - if(!certs[0].allowed_usage("PKIX.OCSPSigning")) + if(!certs[0].allowed_extended_usage("PKIX.OCSPSigning")) throw Exception("OCSP response cert does not allow OCSP signing"); auto result = x509_path_validate(certs, Path_Validation_Restrictions(), trusted_roots); diff --git a/src/lib/cert/x509/ocsp_types.cpp b/src/lib/cert/x509/ocsp_types.cpp index ba5b825f7..d470c2fa1 100644 --- a/src/lib/cert/x509/ocsp_types.cpp +++ b/src/lib/cert/x509/ocsp_types.cpp @@ -92,7 +92,7 @@ void CertID::decode_from(class BER_Decoder& from) void SingleResponse::encode_into(class DER_Encoder&) const { - throw Exception("Not implemented (SingleResponse::encode_into)"); + throw Not_Implemented("SingleResponse::encode_into"); } void SingleResponse::decode_from(class BER_Decoder& from) diff --git a/src/lib/cert/x509/x509_ca.cpp b/src/lib/cert/x509/x509_ca.cpp index 46c8c65f2..58c6676f4 100644 --- a/src/lib/cert/x509/x509_ca.cpp +++ b/src/lib/cert/x509/x509_ca.cpp @@ -52,11 +52,14 @@ X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, { Key_Constraints constraints; if(req.is_CA()) + { constraints = Key_Constraints(KEY_CERT_SIGN | CRL_SIGN); + } else { std::unique_ptr<Public_Key> key(req.subject_public_key()); - constraints = find_constraints(*key, req.constraints()); + verify_cert_constraints_valid_for_key_type(*key, req.constraints()); + constraints = req.constraints(); } Extensions extensions; @@ -65,7 +68,10 @@ X509_Certificate X509_CA::sign_request(const PKCS10_Request& req, new Cert_Extension::Basic_Constraints(req.is_CA(), req.path_limit()), true); - extensions.add(new Cert_Extension::Key_Usage(constraints), true); + if(constraints != NO_CONSTRAINTS) + { + extensions.add(new Cert_Extension::Key_Usage(constraints), true); + } extensions.add(new Cert_Extension::Authority_Key_ID(m_cert.subject_key_id())); extensions.add(new Cert_Extension::Subject_Key_ID(req.raw_public_key())); @@ -233,13 +239,17 @@ PK_Signer* choose_sig_format(const Private_Key& key, std::string padding; if(algo_name == "RSA") + { padding = "EMSA3"; - else if(algo_name == "DSA") + } + else if(algo_name == "DSA" || algo_name == "ECDSA" || algo_name == "ECGDSA" || algo_name == "ECKCDSA") + { padding = "EMSA1"; - else if(algo_name == "ECDSA") - padding = "EMSA1_BSI"; + } else + { throw Invalid_Argument("Unknown X.509 signing key type: " + algo_name); + } const Signature_Format format = (key.message_parts() > 1) ? DER_SEQUENCE : IEEE_1363; diff --git a/src/lib/cert/x509/x509_ca.h b/src/lib/cert/x509/x509_ca.h index 6ea51cd06..ba3724f5e 100644 --- a/src/lib/cert/x509/x509_ca.h +++ b/src/lib/cert/x509/x509_ca.h @@ -22,7 +22,6 @@ namespace Botan { class BOTAN_DLL X509_CA { public: - /** * Sign a PKCS#10 Request. * @param req the request to sign diff --git a/src/lib/cert/x509/x509_ext.cpp b/src/lib/cert/x509/x509_ext.cpp index 85d40bf21..650c20d53 100644 --- a/src/lib/cert/x509/x509_ext.cpp +++ b/src/lib/cert/x509/x509_ext.cpp @@ -1,6 +1,7 @@ /* * X.509 Certificate Extensions * (C) 1999-2010,2012 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -293,7 +294,9 @@ void Key_Usage::decode_inner(const std::vector<byte>& in) u16bit usage = 0; for(size_t i = 1; i != obj.value.size(); ++i) - usage = (obj.value[i] << 8) | usage; + { + usage = (obj.value[i] << 8*(sizeof(usage)-i)) | usage; + } m_constraints = Key_Constraints(usage); } @@ -461,7 +464,7 @@ void Extended_Key_Usage::contents_to(Data_Store& subject, Data_Store&) const */ std::vector<byte> Name_Constraints::encode_inner() const { - throw std::runtime_error("Name_Constraints encoding not implemented"); + throw Not_Implemented("Name_Constraints encoding"); } @@ -777,7 +780,7 @@ void CRL_ReasonCode::contents_to(Data_Store& info, Data_Store&) const std::vector<byte> CRL_Distribution_Points::encode_inner() const { - throw Exception("CRL_Distribution_Points encoding not implemented"); + throw Not_Implemented("CRL_Distribution_Points encoding"); } void CRL_Distribution_Points::decode_inner(const std::vector<byte>& buf) @@ -800,7 +803,7 @@ void CRL_Distribution_Points::contents_to(Data_Store& info, Data_Store&) const void CRL_Distribution_Points::Distribution_Point::encode_into(class DER_Encoder&) const { - throw Exception("CRL_Distribution_Points encoding not implemented"); + throw Not_Implemented("CRL_Distribution_Points encoding"); } void CRL_Distribution_Points::Distribution_Point::decode_from(class BER_Decoder& ber) @@ -815,16 +818,15 @@ void CRL_Distribution_Points::Distribution_Point::decode_from(class BER_Decoder& std::vector<byte> Unknown_Critical_Extension::encode_inner() const { - throw Exception("Unknown_Critical_Extension encoding not implemented"); + throw Not_Implemented("Unknown_Critical_Extension encoding"); } -void Unknown_Critical_Extension::decode_inner(const std::vector<byte>& buf) +void Unknown_Critical_Extension::decode_inner(const std::vector<byte>&) { } -void Unknown_Critical_Extension::contents_to(Data_Store& info, Data_Store&) const +void Unknown_Critical_Extension::contents_to(Data_Store&, Data_Store&) const { - // TODO: textual representation? } } diff --git a/src/lib/cert/x509/x509cert.cpp b/src/lib/cert/x509/x509cert.cpp index d7da00af0..ffedf43f0 100644 --- a/src/lib/cert/x509/x509cert.cpp +++ b/src/lib/cert/x509/x509cert.cpp @@ -1,6 +1,7 @@ /* * X.509 Certificates * (C) 1999-2010,2015 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -257,10 +258,10 @@ bool X509_Certificate::allowed_usage(Key_Constraints usage) const { if(constraints() == NO_CONSTRAINTS) return true; - return ((constraints() & usage) != 0); + return ((constraints() & usage) == usage); } -bool X509_Certificate::allowed_usage(const std::string& usage) const +bool X509_Certificate::allowed_extended_usage(const std::string& usage) const { const std::vector<std::string> ex = ex_constraints(); @@ -275,19 +276,21 @@ bool X509_Certificate::allowed_usage(const std::string& usage) const 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_Constraints(DATA_ENCIPHERMENT | KEY_ENCIPHERMENT | DIGITAL_SIGNATURE)) && allowed_usage("PKIX.ServerAuth"); + 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(Key_Constraints(DIGITAL_SIGNATURE | NON_REPUDIATION)) && allowed_usage("PKIX.ClientAuth"); + return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(KEY_AGREEMENT)) && allowed_extended_usage("PKIX.ClientAuth"); case Usage_Type::OCSP_RESPONDER: - return allowed_usage(Key_Constraints(DIGITAL_SIGNATURE | NON_REPUDIATION)) && allowed_usage("PKIX.OCSPSigning"); + return (allowed_usage(DIGITAL_SIGNATURE) || allowed_usage(NON_REPUDIATION)) && allowed_extended_usage("PKIX.OCSPSigning"); case Usage_Type::CERTIFICATE_AUTHORITY: return is_CA_cert(); @@ -296,6 +299,33 @@ bool X509_Certificate::allowed_usage(Usage_Type usage) const 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 + { + const std::vector<std::string> ex = ex_constraints(); + + if(ex.empty()) + { + return false; + } + + if(std::find(ex.begin(), ex.end(), ex_constraint) != ex.end()) + { + return true; + } + + return false; + } + /* * Return the path length constraint */ @@ -538,7 +568,7 @@ std::string X509_Certificate::to_string() const if(constraints & DIGITAL_SIGNATURE) out << " Digital Signature\n"; if(constraints & NON_REPUDIATION) - out << " Non-Repuidation\n"; + out << " Non-Repudiation\n"; if(constraints & KEY_ENCIPHERMENT) out << " Key Encipherment\n"; if(constraints & DATA_ENCIPHERMENT) @@ -549,6 +579,10 @@ std::string X509_Certificate::to_string() const 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"; } std::vector<std::string> policies = this->policies(); diff --git a/src/lib/cert/x509/x509cert.h b/src/lib/cert/x509/x509cert.h index c521cf7ca..eb98f9c3d 100644 --- a/src/lib/cert/x509/x509cert.h +++ b/src/lib/cert/x509/x509cert.h @@ -33,7 +33,7 @@ enum class Usage_Type /** * This class represents X.509 Certificate */ -class BOTAN_DLL X509_Certificate final : public X509_Object +class BOTAN_DLL X509_Certificate : public X509_Object { public: /** @@ -140,17 +140,39 @@ class BOTAN_DLL X509_Certificate final : public X509_Object */ 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 and only if name (referring to an extended key - * constraint, eg "PKIX.ServerAuth") is included in the extended - * key extension. + * 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_usage(const std::string& usage) const; + bool allowed_extended_usage(const std::string& 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 has_ex_constraint(const std::string& ex_constraint) const; + /** * Get the path limit as defined in the BasicConstraints extension of * this certificate. diff --git a/src/lib/cert/x509/x509opt.cpp b/src/lib/cert/x509/x509opt.cpp index 158f4c779..2dd2098fe 100644 --- a/src/lib/cert/x509/x509opt.cpp +++ b/src/lib/cert/x509/x509opt.cpp @@ -62,19 +62,6 @@ void X509_Cert_Options::CA_key(size_t limit) } /* -* Do basic sanity checks -*/ -void X509_Cert_Options::sanity_check() const - { - if(common_name.empty() || country.empty()) - throw Encoding_Error("X.509 certificate: name and country MUST be set"); - if(country.size() != 2) - throw Encoding_Error("Invalid ISO country code: " + country); - if(start >= end) - throw Encoding_Error("X509_Cert_Options: invalid time constraints"); - } - -/* * Initialize the certificate options */ X509_Cert_Options::X509_Cert_Options(const std::string& initial_opts, diff --git a/src/lib/cert/x509/x509self.cpp b/src/lib/cert/x509/x509self.cpp index 7d1c01c37..102e24f77 100644 --- a/src/lib/cert/x509/x509self.cpp +++ b/src/lib/cert/x509/x509self.cpp @@ -49,17 +49,20 @@ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, X509_DN subject_dn; AlternativeName subject_alt; - opts.sanity_check(); - std::vector<byte> pub_key = X509::BER_encode(key); std::unique_ptr<PK_Signer> signer(choose_sig_format(key, 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 - constraints = find_constraints(key, opts.constraints); + { + verify_cert_constraints_valid_for_key_type(key, opts.constraints); + constraints = opts.constraints; + } Extensions extensions; @@ -67,7 +70,10 @@ X509_Certificate create_self_signed_cert(const X509_Cert_Options& opts, new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit), true); - extensions.add(new Cert_Extension::Key_Usage(constraints), true); + if(constraints != NO_CONSTRAINTS) + { + extensions.add(new Cert_Extension::Key_Usage(constraints), true); + } extensions.add(new Cert_Extension::Subject_Key_ID(pub_key)); @@ -95,24 +101,33 @@ PKCS10_Request create_cert_req(const X509_Cert_Options& opts, X509_DN subject_dn; AlternativeName subject_alt; - opts.sanity_check(); - std::vector<byte> pub_key = X509::BER_encode(key); std::unique_ptr<PK_Signer> signer(choose_sig_format(key, 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; extensions.add( new Cert_Extension::Basic_Constraints(opts.is_CA, opts.path_limit)); - extensions.add( - new Cert_Extension::Key_Usage( - opts.is_CA ? Key_Constraints(KEY_CERT_SIGN | CRL_SIGN) : - find_constraints(key, opts.constraints) - ) - ); + + 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( diff --git a/src/lib/cert/x509/x509self.h b/src/lib/cert/x509/x509self.h index a4bbad214..401b2eb2f 100644 --- a/src/lib/cert/x509/x509self.h +++ b/src/lib/cert/x509/x509self.h @@ -115,11 +115,6 @@ class BOTAN_DLL X509_Cert_Options std::vector<OID> ex_constraints; /** - * Check the options set in this object for validity. - */ - void sanity_check() const; - - /** * Mark the certificate as a CA certificate and set the path limit. * @param limit the path limit to be set in the BasicConstraints extension. */ diff --git a/src/lib/entropy/beos_stats/es_beos.cpp b/src/lib/entropy/beos_stats/es_beos.cpp index aa0e257a9..907ca37bb 100644 --- a/src/lib/entropy/beos_stats/es_beos.cpp +++ b/src/lib/entropy/beos_stats/es_beos.cpp @@ -16,48 +16,51 @@ namespace Botan { /** * BeOS entropy poll */ -void BeOS_EntropySource::poll(Entropy_Accumulator& accum) +size_t BeOS_EntropySource::poll(RandomNumberGenerator& rng) { + size_t bits = 0; + system_info info_sys; get_system_info(&info_sys); - accum.add(info_sys, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_sys); key_info info_key; // current state of the keyboard get_key_info(&info_key); - accum.add(info_key, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_key); team_info info_team; int32 cookie_team = 0; while(get_next_team_info(&cookie_team, &info_team) == B_OK) { - accum.add(info_team, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_team); team_id id = info_team.team; int32 cookie = 0; thread_info info_thr; while(get_next_thread_info(id, &cookie, &info_thr) == B_OK) - accum.add(info_thr, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_thr); cookie = 0; image_info info_img; while(get_next_image_info(id, &cookie, &info_img) == B_OK) - accum.add(info_img, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_img); cookie = 0; sem_info info_sem; while(get_next_sem_info(id, &cookie, &info_sem) == B_OK) - accum.add(info_sem, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_sem); cookie = 0; area_info info_area; while(get_next_area_info(id, &cookie, &info_area) == B_OK) - accum.add(info_area, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(info_area); - if(accum.polling_finished()) - break; + bits += 32; } + + return bits; } } diff --git a/src/lib/entropy/beos_stats/es_beos.h b/src/lib/entropy/beos_stats/es_beos.h index a5b90a607..e40433b6c 100644 --- a/src/lib/entropy/beos_stats/es_beos.h +++ b/src/lib/entropy/beos_stats/es_beos.h @@ -20,7 +20,7 @@ class BeOS_EntropySource final : public Entropy_Source private: std::string name() const override { return "system_stats"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/entropy/cryptoapi_rng/es_capi.cpp b/src/lib/entropy/cryptoapi_rng/es_capi.cpp index c9d8fb7c4..a1d809d0d 100644 --- a/src/lib/entropy/cryptoapi_rng/es_capi.cpp +++ b/src/lib/entropy/cryptoapi_rng/es_capi.cpp @@ -1,6 +1,6 @@ /* * Win32 CryptoAPI EntropySource -* (C) 1999-2009 Jack Lloyd +* (C) 1999-2009,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -16,38 +16,34 @@ namespace Botan { namespace { -class CSP_Handle +class CSP_Handle_Impl : public Win32_CAPI_EntropySource::CSP_Handle { public: - explicit CSP_Handle(u64bit capi_provider) + explicit CSP_Handle_Impl(u64bit capi_provider) { - m_valid = false; - DWORD prov_type = (DWORD)capi_provider; - - if(CryptAcquireContext(&m_handle, 0, 0, - prov_type, CRYPT_VERIFYCONTEXT)) - m_valid = true; + m_valid = ::CryptAcquireContext(&m_handle, + 0, + 0, + static_cast<DWORD>(capi_provider), + CRYPT_VERIFYCONTEXT); } - ~CSP_Handle() + ~CSP_Handle_Impl() { - if(is_valid()) - CryptReleaseContext(m_handle, 0); + if(m_valid) + ::CryptReleaseContext(m_handle, 0); } size_t gen_random(byte out[], size_t n) const { - if(is_valid() && CryptGenRandom(m_handle, static_cast<DWORD>(n), out)) + if(m_valid && ::CryptGenRandom(m_handle, static_cast<DWORD>(n), out)) return n; return 0; } - bool is_valid() const { return m_valid; } - - HCRYPTPROV get_handle() const { return m_handle; } private: - HCRYPTPROV m_handle; bool m_valid; + HCRYPTPROV m_handle; }; } @@ -55,20 +51,23 @@ class CSP_Handle /* * Gather Entropy from Win32 CAPI */ -void Win32_CAPI_EntropySource::poll(Entropy_Accumulator& accum) +size_t Win32_CAPI_EntropySource::poll(RandomNumberGenerator& rng) { - secure_vector<byte>& buf = accum.get_io_buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); + secure_vector<uint8_t> buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); + size_t bits = 0; - for(size_t i = 0; i != m_prov_types.size(); ++i) + for(size_t i = 0; i != m_csp_provs.size(); ++i) { - CSP_Handle csp(m_prov_types[i]); + size_t got = m_csp_provs[i]->gen_random(buf.data(), buf.size()); - if(size_t got = csp.gen_random(buf.data(), buf.size())) + if(got > 0) { - accum.add(buf.data(), got, BOTAN_ENTROPY_ESTIMATE_STRONG_RNG); - break; + rng.add_entropy(buf.data(), got); + bits += got * 8; } } + + return bits; } /* @@ -76,18 +75,21 @@ void Win32_CAPI_EntropySource::poll(Entropy_Accumulator& accum) */ Win32_CAPI_EntropySource::Win32_CAPI_EntropySource(const std::string& provs) { - std::vector<std::string> capi_provs = split_on(provs, ':'); - - for(size_t i = 0; i != capi_provs.size(); ++i) + for(std::string prov_name : split_on(provs, ':')) { - if(capi_provs[i] == "RSA_FULL") m_prov_types.push_back(PROV_RSA_FULL); - if(capi_provs[i] == "INTEL_SEC") m_prov_types.push_back(PROV_INTEL_SEC); - if(capi_provs[i] == "FORTEZZA") m_prov_types.push_back(PROV_FORTEZZA); - if(capi_provs[i] == "RNG") m_prov_types.push_back(PROV_RNG); + DWORD prov_type; + + if(prov_name == "RSA_FULL") + prov_type = PROV_RSA_FULL; + else if(prov_name == "INTEL_SEC") + prov_type = PROV_INTEL_SEC; + else if(prov_name == "RNG") + prov_type = PROV_RNG; + else + continue; + + m_csp_provs.push_back(std::unique_ptr<CSP_Handle>(new CSP_Handle_Impl(prov_type))); } - - if(m_prov_types.size() == 0) - m_prov_types.push_back(PROV_RSA_FULL); } } diff --git a/src/lib/entropy/cryptoapi_rng/es_capi.h b/src/lib/entropy/cryptoapi_rng/es_capi.h index b1c60bfa1..82a779672 100644 --- a/src/lib/entropy/cryptoapi_rng/es_capi.h +++ b/src/lib/entropy/cryptoapi_rng/es_capi.h @@ -21,15 +21,21 @@ class Win32_CAPI_EntropySource final : public Entropy_Source public: std::string name() const override { return "win32_cryptoapi"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; - /** - * Win32_Capi_Entropysource Constructor - * @param provs list of providers, separated by ':' - */ + /** + * Win32_Capi_Entropysource Constructor + * @param provs list of providers, separated by ':' + */ explicit Win32_CAPI_EntropySource(const std::string& provs = ""); + + class CSP_Handle + { + public: + virtual size_t gen_random(byte out[], size_t n) const = 0; + }; private: - std::vector<u64bit> m_prov_types; + std::vector<std::unique_ptr<CSP_Handle>> m_csp_provs; }; } diff --git a/src/lib/entropy/darwin_secrandom/darwin_secrandom.cpp b/src/lib/entropy/darwin_secrandom/darwin_secrandom.cpp index 4f1ed87bd..b53e4061e 100644 --- a/src/lib/entropy/darwin_secrandom/darwin_secrandom.cpp +++ b/src/lib/entropy/darwin_secrandom/darwin_secrandom.cpp @@ -7,19 +7,21 @@ #include <botan/internal/darwin_secrandom.h> #include <Security/Security.h> +#include <Security/SecRandom.h> namespace Botan { /** * Gather entropy from SecRandomCopyBytes */ -void Darwin_SecRandom::poll(Entropy_Accumulator& accum) +size_t Darwin_SecRandom::poll(RandomNumberGenerator& rng) { - secure_vector<byte>& buf = accum.get_io_buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); + secure_vector<uint8_t> buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); if(0 == SecRandomCopyBytes(kSecRandomDefault, buf.size(), buf.data())) { - accum.add(buf.data(), buf.size(), BOTAN_ENTROPY_ESTIMATE_STRONG_RNG); + rng.add_entropy(buf.data(), buf.size()); + return buf.size() * 8; } } diff --git a/src/lib/entropy/darwin_secrandom/darwin_secrandom.h b/src/lib/entropy/darwin_secrandom/darwin_secrandom.h index 09cdc208d..e1c012459 100644 --- a/src/lib/entropy/darwin_secrandom/darwin_secrandom.h +++ b/src/lib/entropy/darwin_secrandom/darwin_secrandom.h @@ -20,7 +20,7 @@ class Darwin_SecRandom final : public Entropy_Source public: std::string name() const override { return "darwin_secrandom"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/entropy/dev_random/dev_random.cpp b/src/lib/entropy/dev_random/dev_random.cpp index aca161d64..b51f19ecb 100644 --- a/src/lib/entropy/dev_random/dev_random.cpp +++ b/src/lib/entropy/dev_random/dev_random.cpp @@ -6,6 +6,7 @@ */ #include <botan/internal/dev_random.h> +#include <botan/exceptn.h> #include <sys/types.h> #include <sys/select.h> @@ -31,14 +32,36 @@ Device_EntropySource::Device_EntropySource(const std::vector<std::string>& fsnam const int flags = O_RDONLY | O_NONBLOCK | O_NOCTTY; + m_max_fd = 0; + for(auto fsname : fsnames) { - fd_type fd = ::open(fsname.c_str(), flags); + int fd = ::open(fsname.c_str(), flags); - if(fd >= 0 && fd < FD_SETSIZE) - m_devices.push_back(fd); - else if(fd >= 0) - ::close(fd); + if(fd > 0) + { + 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); + } + else + { + /* + 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)); + } + } } } @@ -47,46 +70,55 @@ Device_EntropySource destructor: close all open devices */ Device_EntropySource::~Device_EntropySource() { - for(size_t i = 0; i != m_devices.size(); ++i) - ::close(m_devices[i]); + for(int fd : m_dev_fds) + { + // ignoring return value here, can't throw in destructor anyway + ::close(fd); + } } /** * Gather entropy from a RNG device */ -void Device_EntropySource::poll(Entropy_Accumulator& accum) +size_t Device_EntropySource::poll(RandomNumberGenerator& rng) { - if(m_devices.empty()) - return; + size_t bits = 0; - fd_type max_fd = m_devices[0]; - fd_set read_set; - FD_ZERO(&read_set); - for(size_t i = 0; i != m_devices.size(); ++i) + if(m_dev_fds.size() > 0) { - FD_SET(m_devices[i], &read_set); - max_fd = std::max(m_devices[i], max_fd); - } - - struct ::timeval timeout; + fd_set read_set; + FD_ZERO(&read_set); - timeout.tv_sec = (BOTAN_SYSTEM_RNG_POLL_TIMEOUT_MS / 1000); - timeout.tv_usec = (BOTAN_SYSTEM_RNG_POLL_TIMEOUT_MS % 1000) * 1000; + for(int dev_fd : m_dev_fds) + { + FD_SET(dev_fd, &read_set); + } - if(::select(max_fd + 1, &read_set, nullptr, nullptr, &timeout) < 0) - return; + secure_vector<uint8_t> io_buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); - secure_vector<byte>& buf = accum.get_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; - for(size_t i = 0; i != m_devices.size(); ++i) - { - if(FD_ISSET(m_devices[i], &read_set)) + if(::select(m_max_fd + 1, &read_set, nullptr, nullptr, &timeout) > 0) { - const ssize_t got = ::read(m_devices[i], buf.data(), buf.size()); - if(got > 0) - accum.add(buf.data(), got, BOTAN_ENTROPY_ESTIMATE_STRONG_RNG); + 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<size_t>(got)); + bits += got * 8; + } + } + } } } + + return bits; } } diff --git a/src/lib/entropy/dev_random/dev_random.h b/src/lib/entropy/dev_random/dev_random.h index 1f29b2f64..7c8df0553 100644 --- a/src/lib/entropy/dev_random/dev_random.h +++ b/src/lib/entropy/dev_random/dev_random.h @@ -22,13 +22,14 @@ class Device_EntropySource final : public Entropy_Source public: std::string name() const override { return "dev_random"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; Device_EntropySource(const std::vector<std::string>& fsnames); + ~Device_EntropySource(); private: - typedef int fd_type; - std::vector<fd_type> m_devices; + std::vector<int> m_dev_fds; + int m_max_fd; }; } diff --git a/src/lib/entropy/egd/es_egd.cpp b/src/lib/entropy/egd/es_egd.cpp index 9bc6de6fe..384516aa8 100644 --- a/src/lib/entropy/egd/es_egd.cpp +++ b/src/lib/entropy/egd/es_egd.cpp @@ -134,22 +134,24 @@ EGD_EntropySource::~EGD_EntropySource() /** * Gather Entropy from EGD */ -void EGD_EntropySource::poll(Entropy_Accumulator& accum) +size_t EGD_EntropySource::poll(RandomNumberGenerator& rng) { std::lock_guard<std::mutex> lock(m_mutex); - secure_vector<byte>& buf = accum.get_io_buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); + secure_vector<byte> buf(BOTAN_SYSTEM_RNG_POLL_REQUEST); for(size_t i = 0; i != m_sockets.size(); ++i) { - size_t got = m_sockets[i].read(buf.data(), buf.size()); + size_t got = m_sockets[i].read(m_io_buf.data(), m_io_buf.size()); if(got) { - accum.add(buf.data(), got, BOTAN_ENTROPY_ESTIMATE_STRONG_RNG); - break; + rng.add_entropy(m_io_buf.data(), got); + return got * 8; } } + + return 0; } } diff --git a/src/lib/entropy/egd/es_egd.h b/src/lib/entropy/egd/es_egd.h index 1a624713a..04b4591e3 100644 --- a/src/lib/entropy/egd/es_egd.h +++ b/src/lib/entropy/egd/es_egd.h @@ -23,7 +23,7 @@ class EGD_EntropySource final : public Entropy_Source public: std::string name() const override { return "egd"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; EGD_EntropySource(const std::vector<std::string>&); ~EGD_EntropySource(); @@ -44,6 +44,7 @@ class EGD_EntropySource final : public Entropy_Source std::mutex m_mutex; std::vector<EGD_Socket> m_sockets; + secure_vector<uint8_t> m_io_buf; }; } diff --git a/src/lib/entropy/entropy_src.h b/src/lib/entropy/entropy_src.h index 539df809a..94c67a18e 100644 --- a/src/lib/entropy/entropy_src.h +++ b/src/lib/entropy/entropy_src.h @@ -1,6 +1,6 @@ /* * EntropySource -* (C) 2008,2009,2014,2015 Jack Lloyd +* (C) 2008,2009,2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,68 +9,15 @@ #define BOTAN_ENTROPY_H__ #include <botan/secmem.h> +#include <botan/rng.h> #include <string> -#include <functional> +#include <chrono> +#include <memory> +#include <vector> namespace Botan { -/** -* Class used to accumulate the poll results of EntropySources -*/ -class BOTAN_DLL Entropy_Accumulator final - { - public: - /** - * Initialize an Entropy_Accumulator - * - * @param accum will be called with poll results, first params the data and - * length, the second a best estimate of min-entropy for the entire buffer; - * out of an abundance of caution this will be zero for many sources. - * accum should return true if it wants the polling to stop, though it may - * still be called again a few more times, and should be careful to return - * true then as well. - */ - explicit Entropy_Accumulator(std::function<bool (const byte[], size_t, double)> accum) : - m_accum_fn(accum) {} - - /** - * @return if our polling goal has been achieved - */ - bool polling_goal_achieved() const { return m_done; } - - bool polling_finished() const { return m_done; } - - /** - * Add entropy to the accumulator - * @param bytes the input bytes - * @param length specifies how many bytes the input is - * @param entropy_bits_per_byte is a best guess at how much - * entropy per byte is in this input - */ - void add(const void* bytes, size_t length, double entropy_bits_per_byte) - { - m_done = m_accum_fn(reinterpret_cast<const byte*>(bytes), - length, entropy_bits_per_byte * length) || m_done; - } - - /** - * Add entropy to the accumulator - * @param v is some value - * @param entropy_bits_per_byte is a best guess at how much - * entropy per byte is in this input - */ - template<typename T> - void add(const T& v, double entropy_bits_per_byte) - { - add(&v, sizeof(T), entropy_bits_per_byte); - } - - secure_vector<byte>& get_io_buf(size_t sz) { m_io_buf.resize(sz); return m_io_buf; } - private: - std::function<bool (const byte[], size_t, double)> m_accum_fn; - secure_vector<byte> m_io_buf; - bool m_done = false; - }; +class RandomNumberGenerator; /** * Abstract interface to a source of entropy @@ -93,9 +40,10 @@ class BOTAN_DLL Entropy_Source /** * Perform an entropy gathering poll - * @param accum is an accumulator object that will be given entropy + * @param rng will be provided with entropy via calls to add_entropy + @ @return conservative estimate of actual entropy added to rng during poll */ - virtual void poll(Entropy_Accumulator& accum) = 0; + virtual size_t poll(RandomNumberGenerator& rng) = 0; virtual ~Entropy_Source() {} }; @@ -109,8 +57,14 @@ class BOTAN_DLL Entropy_Sources final std::vector<std::string> enabled_sources() const; - void poll(Entropy_Accumulator& accum); - bool poll_just(Entropy_Accumulator& accum, const std::string& src); + 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() {} explicit Entropy_Sources(const std::vector<std::string>& sources); diff --git a/src/lib/entropy/entropy_srcs.cpp b/src/lib/entropy/entropy_srcs.cpp index a5dc0a819..22d2e5e4b 100644 --- a/src/lib/entropy/entropy_srcs.cpp +++ b/src/lib/entropy/entropy_srcs.cpp @@ -6,6 +6,7 @@ */ #include <botan/entropy_src.h> +#include <botan/rng.h> #if defined(BOTAN_HAS_ENTROPY_SRC_HIGH_RESOLUTION_TIMER) #include <botan/internal/hres_timer.h> @@ -68,7 +69,7 @@ std::unique_ptr<Entropy_Source> Entropy_Source::create(const std::string& name) return std::unique_ptr<Entropy_Source>(new Intel_Rdrand); #endif } - + if(name == "rdseed") { #if defined(BOTAN_HAS_ENTROPY_SRC_RDSEED) @@ -154,28 +155,38 @@ std::vector<std::string> Entropy_Sources::enabled_sources() const return sources; } -void Entropy_Sources::poll(Entropy_Accumulator& accum) +size_t Entropy_Sources::poll(RandomNumberGenerator& rng, + size_t poll_bits, + std::chrono::milliseconds timeout) { - for(size_t i = 0; i != m_srcs.size(); ++i) + typedef std::chrono::system_clock clock; + + auto deadline = clock::now() + timeout; + + size_t bits_collected = 0; + + for(Entropy_Source* src : m_srcs) { - m_srcs[i]->poll(accum); - if(accum.polling_goal_achieved()) + bits_collected += src->poll(rng); + + if (bits_collected >= poll_bits || clock::now() > deadline) break; } + + return bits_collected; } -bool Entropy_Sources::poll_just(Entropy_Accumulator& accum, const std::string& the_src) +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) { - m_srcs[i]->poll(accum); - return true; + return m_srcs[i]->poll(rng); } } - return false; + return 0; } Entropy_Sources::Entropy_Sources(const std::vector<std::string>& sources) diff --git a/src/lib/entropy/hres_timer/hres_timer.cpp b/src/lib/entropy/hres_timer/hres_timer.cpp deleted file mode 100644 index e2a5ddbef..000000000 --- a/src/lib/entropy/hres_timer/hres_timer.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/* -* High Resolution Timestamp Entropy Source -* (C) 1999-2009,2011,2014,2016 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/internal/hres_timer.h> -#include <botan/internal/os_utils.h> - -#if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) - #include <time.h> -#endif - -namespace Botan { - -/* -* Get the timestamp -*/ -void High_Resolution_Timestamp::poll(Entropy_Accumulator& accum) - { - accum.add(OS::get_processor_timestamp(), BOTAN_ENTROPY_ESTIMATE_TIMESTAMPS); - - accum.add(OS::get_system_timestamp_ns(), BOTAN_ENTROPY_ESTIMATE_TIMESTAMPS); - -#if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) - -#define CLOCK_GETTIME_POLL(src) \ - do { \ - struct timespec ts; \ - ::clock_gettime(src, &ts); \ - accum.add(&ts, sizeof(ts), BOTAN_ENTROPY_ESTIMATE_TIMESTAMPS); \ - } while(0) - -#if defined(CLOCK_REALTIME) - CLOCK_GETTIME_POLL(CLOCK_REALTIME); -#endif - -#if defined(CLOCK_MONOTONIC) - CLOCK_GETTIME_POLL(CLOCK_MONOTONIC); -#endif - -#if defined(CLOCK_MONOTONIC_RAW) - CLOCK_GETTIME_POLL(CLOCK_MONOTONIC_RAW); -#endif - -#if defined(CLOCK_PROCESS_CPUTIME_ID) - CLOCK_GETTIME_POLL(CLOCK_PROCESS_CPUTIME_ID); -#endif - -#if defined(CLOCK_THREAD_CPUTIME_ID) - CLOCK_GETTIME_POLL(CLOCK_THREAD_CPUTIME_ID); -#endif - -#undef CLOCK_GETTIME_POLL - -#endif - } - -} diff --git a/src/lib/entropy/hres_timer/hres_timer.h b/src/lib/entropy/hres_timer/hres_timer.h deleted file mode 100644 index d297a87b1..000000000 --- a/src/lib/entropy/hres_timer/hres_timer.h +++ /dev/null @@ -1,30 +0,0 @@ -/* -* High Resolution Timestamp Entropy Source -* (C) 1999-2009 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_ENTROPY_SRC_HRES_TIMER_H__ -#define BOTAN_ENTROPY_SRC_HRES_TIMER_H__ - -#include <botan/entropy_src.h> - -namespace Botan { - -/** -* Entropy source using high resolution timers -* -* @note Any results from timers are marked as not contributing entropy -* to the poll, as a local attacker could observe them directly. -*/ -class High_Resolution_Timestamp final : public Entropy_Source - { - public: - std::string name() const override { return "timestamp"; } - void poll(Entropy_Accumulator& accum) override; - }; - -} - -#endif diff --git a/src/lib/entropy/hres_timer/info.txt b/src/lib/entropy/hres_timer/info.txt deleted file mode 100644 index dfe8fab0b..000000000 --- a/src/lib/entropy/hres_timer/info.txt +++ /dev/null @@ -1,13 +0,0 @@ -define ENTROPY_SRC_HIGH_RESOLUTION_TIMER 20131128 - -<source> -hres_timer.cpp -</source> - -<header:internal> -hres_timer.h -</header:internal> - -<libs> -linux -> rt -</libs> diff --git a/src/lib/entropy/info.txt b/src/lib/entropy/info.txt index ba5a4044d..d80176113 100644 --- a/src/lib/entropy/info.txt +++ b/src/lib/entropy/info.txt @@ -1 +1,5 @@ define ENTROPY_SOURCE 20151120 + +<requires> +rng +</requires> diff --git a/src/lib/entropy/proc_walk/proc_walk.cpp b/src/lib/entropy/proc_walk/proc_walk.cpp index c59a8227b..beaa57308 100644 --- a/src/lib/entropy/proc_walk/proc_walk.cpp +++ b/src/lib/entropy/proc_walk/proc_walk.cpp @@ -110,7 +110,7 @@ int Directory_Walker::next_fd() } -void ProcWalking_EntropySource::poll(Entropy_Accumulator& accum) +size_t ProcWalking_EntropySource::poll(RandomNumberGenerator& rng) { const size_t MAX_FILES_READ_PER_POLL = 2048; @@ -121,6 +121,8 @@ void ProcWalking_EntropySource::poll(Entropy_Accumulator& accum) 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(); @@ -136,11 +138,18 @@ void ProcWalking_EntropySource::poll(Entropy_Accumulator& accum) ::close(fd); if(got > 0) - accum.add(m_buf.data(), got, BOTAN_ENTROPY_ESTIMATE_SYSTEM_TEXT); + { + rng.add_entropy(m_buf.data(), static_cast<size_t>(got)); - if(accum.polling_finished()) + // Conservative estimate of 4 bits per file + bits += 4; + } + + if(bits > 128) break; } + + return bits; } } diff --git a/src/lib/entropy/proc_walk/proc_walk.h b/src/lib/entropy/proc_walk/proc_walk.h index f6db8185a..369b52699 100644 --- a/src/lib/entropy/proc_walk/proc_walk.h +++ b/src/lib/entropy/proc_walk/proc_walk.h @@ -28,7 +28,7 @@ class ProcWalking_EntropySource final : public Entropy_Source public: std::string name() const override { return "proc_walk"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; ProcWalking_EntropySource(const std::string& root_dir) : m_path(root_dir), m_dir(nullptr) {} diff --git a/src/lib/entropy/rdrand/info.txt b/src/lib/entropy/rdrand/info.txt index e3e1a2a50..ebc7fb747 100644 --- a/src/lib/entropy/rdrand/info.txt +++ b/src/lib/entropy/rdrand/info.txt @@ -1,6 +1,8 @@ define ENTROPY_SRC_RDRAND 20131128 -need_isa rdrand +<requires> +rdrand_rng +</requires> <source> rdrand.cpp @@ -9,15 +11,3 @@ rdrand.cpp <header:internal> rdrand.h </header:internal> - -<arch> -x86_32 -x86_64 -</arch> - -<cc> -gcc -clang -icc -msvc -</cc> diff --git a/src/lib/entropy/rdrand/rdrand.cpp b/src/lib/entropy/rdrand/rdrand.cpp index 89234b460..7fa05c605 100644 --- a/src/lib/entropy/rdrand/rdrand.cpp +++ b/src/lib/entropy/rdrand/rdrand.cpp @@ -7,41 +7,24 @@ */ #include <botan/internal/rdrand.h> +#include <botan/rdrand_rng.h> #include <botan/cpuid.h> #include <botan/build.h> -#if !defined(BOTAN_USE_GCC_INLINE_ASM) - #include <immintrin.h> -#endif - namespace Botan { -void Intel_Rdrand::poll(Entropy_Accumulator& accum) { - if(!CPUID::has_rdrand()) - return; - - for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p) +size_t Intel_Rdrand::poll(RandomNumberGenerator& rng) { + if(CPUID::has_rdrand() && BOTAN_ENTROPY_INTEL_RNG_POLLS > 0) { - for(size_t i = 0; i != BOTAN_ENTROPY_RDRAND_RETRIES; ++i) - { - uint32_t r = 0; + RDRAND_RNG rdrand_rng; + secure_vector<uint8_t> buf(4 * BOTAN_ENTROPY_INTEL_RNG_POLLS); -#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) - { - accum.add(r, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG); - break; - } - } + rdrand_rng.randomize(buf.data(), buf.size()); + rng.add_entropy(buf.data(), buf.size()); } + + // RDRAND is used but not trusted + return 0; } } diff --git a/src/lib/entropy/rdrand/rdrand.h b/src/lib/entropy/rdrand/rdrand.h index 48d090775..db9de39b6 100644 --- a/src/lib/entropy/rdrand/rdrand.h +++ b/src/lib/entropy/rdrand/rdrand.h @@ -20,7 +20,7 @@ class Intel_Rdrand final : public Entropy_Source { public: std::string name() const override { return "rdrand"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/entropy/rdseed/rdseed.cpp b/src/lib/entropy/rdseed/rdseed.cpp index 2ba2075cc..325edfd41 100644 --- a/src/lib/entropy/rdseed/rdseed.cpp +++ b/src/lib/entropy/rdseed/rdseed.cpp @@ -15,32 +15,34 @@ namespace Botan { -void Intel_Rdseed::poll(Entropy_Accumulator& accum) { - if(!CPUID::has_rdseed()) - return; - - for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p) +size_t Intel_Rdseed::poll(RandomNumberGenerator& rng) { + if(CPUID::has_rdseed()) { - for(size_t i = 0; i != BOTAN_ENTROPY_RDSEED_RETRIES; ++i) + for(size_t p = 0; p != BOTAN_ENTROPY_INTEL_RNG_POLLS; ++p) { - uint32_t r = 0; + 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; + int cf = 0; - // Encoding of rdseed %eax - asm(".byte 0x0F, 0xC7, 0xF8; adcl $0,%1" : - "=a" (r), "=r" (cf) : "0" (r), "1" (cf) : "cc"); + // 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); + int cf = _rdseed32_step(&r); #endif - if(1 == cf) - { - accum.add(r, BOTAN_ENTROPY_ESTIMATE_HARDWARE_RNG); - break; + if(1 == cf) + { + rng.add_entropy_T(r); + break; + } } } } + + return 0; } } diff --git a/src/lib/entropy/rdseed/rdseed.h b/src/lib/entropy/rdseed/rdseed.h index f86c32768..4ea584354 100644 --- a/src/lib/entropy/rdseed/rdseed.h +++ b/src/lib/entropy/rdseed/rdseed.h @@ -20,7 +20,7 @@ class Intel_Rdseed final : public Entropy_Source { public: std::string name() const override { return "rdseed"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/entropy/unix_procs/unix_procs.cpp b/src/lib/entropy/unix_procs/unix_procs.cpp index 55ad295cd..8f885cfcf 100644 --- a/src/lib/entropy/unix_procs/unix_procs.cpp +++ b/src/lib/entropy/unix_procs/unix_procs.cpp @@ -67,17 +67,52 @@ Unix_EntropySource::Unix_EntropySource(const std::vector<std::string>& trusted_p { } -void UnixProcessInfo_EntropySource::poll(Entropy_Accumulator& accum) +size_t UnixProcessInfo_EntropySource::poll(RandomNumberGenerator& rng) { - accum.add(::getpid(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); - accum.add(::getppid(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); - accum.add(::getuid(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); - accum.add(::getgid(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); - accum.add(::getpgrp(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); + rng.add_entropy_T(::getpid()); + rng.add_entropy_T(::getppid()); + rng.add_entropy_T(::getuid()); + rng.add_entropy_T(::getgid()); + rng.add_entropy_T(::getpgrp()); struct ::rusage usage; ::getrusage(RUSAGE_SELF, &usage); - accum.add(usage, BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); + rng.add_entropy_T(usage); + +#if defined(BOTAN_TARGET_OS_HAS_CLOCK_GETTIME) + +#define CLOCK_GETTIME_POLL(src) \ + do { \ + struct timespec ts; \ + ::clock_gettime(src, &ts); \ + rng.add_entropy_T(ts); \ + } while(0) + +#if defined(CLOCK_REALTIME) + CLOCK_GETTIME_POLL(CLOCK_REALTIME); +#endif + +#if defined(CLOCK_MONOTONIC) + CLOCK_GETTIME_POLL(CLOCK_MONOTONIC); +#endif + +#if defined(CLOCK_MONOTONIC_RAW) + CLOCK_GETTIME_POLL(CLOCK_MONOTONIC_RAW); +#endif + +#if defined(CLOCK_PROCESS_CPUTIME_ID) + CLOCK_GETTIME_POLL(CLOCK_PROCESS_CPUTIME_ID); +#endif + +#if defined(CLOCK_THREAD_CPUTIME_ID) + CLOCK_GETTIME_POLL(CLOCK_THREAD_CPUTIME_ID); +#endif + +#undef CLOCK_GETTIME_POLL + +#endif + + return 0; } void Unix_EntropySource::Unix_Process::spawn(const std::vector<std::string>& args) @@ -168,11 +203,11 @@ const std::vector<std::string>& Unix_EntropySource::next_source() return src; } -void Unix_EntropySource::poll(Entropy_Accumulator& accum) +size_t Unix_EntropySource::poll(RandomNumberGenerator& rng) { // refuse to run setuid or setgid, or as root if((getuid() != geteuid()) || (getgid() != getegid()) || (geteuid() == 0)) - return; + return 0; std::lock_guard<std::mutex> lock(m_mutex); @@ -192,13 +227,15 @@ void Unix_EntropySource::poll(Entropy_Accumulator& accum) } if(m_sources.empty()) - return; // still empty, really nothing to try + return 0; // still empty, really nothing to try const size_t MS_WAIT_TIME = 32; m_buf.resize(4096); - while(!accum.polling_finished()) + size_t bytes = 0; + + while(bytes < 128 * 1024) // arbitrary limit... { while(m_procs.size() < m_concurrent) m_procs.emplace_back(Unix_Process(next_source())); @@ -228,7 +265,7 @@ void Unix_EntropySource::poll(Entropy_Accumulator& accum) timeout.tv_usec = (MS_WAIT_TIME % 1000) * 1000; if(::select(max_fd + 1, &read_set, nullptr, nullptr, &timeout) < 0) - return; // or continue? + break; // or continue? for(auto& proc : m_procs) { @@ -237,13 +274,19 @@ void Unix_EntropySource::poll(Entropy_Accumulator& accum) if(FD_ISSET(fd, &read_set)) { const ssize_t got = ::read(fd, m_buf.data(), m_buf.size()); + if(got > 0) - accum.add(m_buf.data(), got, BOTAN_ENTROPY_ESTIMATE_SYSTEM_TEXT); + { + rng.add_entropy(m_buf.data(), got); + bytes += got; + } else proc.spawn(next_source()); } } } + + return bytes / 1024; } } diff --git a/src/lib/entropy/unix_procs/unix_procs.h b/src/lib/entropy/unix_procs/unix_procs.h index e1749af5f..27f7ab5bb 100644 --- a/src/lib/entropy/unix_procs/unix_procs.h +++ b/src/lib/entropy/unix_procs/unix_procs.h @@ -25,7 +25,7 @@ class Unix_EntropySource final : public Entropy_Source public: std::string name() const override { return "unix_procs"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; /** * @param trusted_paths is a list of directories that are assumed @@ -83,7 +83,7 @@ class UnixProcessInfo_EntropySource final : public Entropy_Source public: std::string name() const override { return "proc_info"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/entropy/win32_stats/es_win32.cpp b/src/lib/entropy/win32_stats/es_win32.cpp index ce0edea83..bbc64eaab 100644 --- a/src/lib/entropy/win32_stats/es_win32.cpp +++ b/src/lib/entropy/win32_stats/es_win32.cpp @@ -1,6 +1,6 @@ /* * Win32 EntropySource -* (C) 1999-2009 Jack Lloyd +* (C) 1999-2009,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -14,44 +14,44 @@ namespace Botan { /** * Win32 poll using stats functions including Tooltip32 */ -void Win32_EntropySource::poll(Entropy_Accumulator& accum) +size_t Win32_EntropySource::poll(RandomNumberGenerator& rng) { /* - First query a bunch of basic statistical stuff, though - don't count it for much in terms of contributed entropy. + First query a bunch of basic statistical stuff */ - accum.add(GetTickCount(), BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); - accum.add(GetMessagePos(), BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); - accum.add(GetMessageTime(), BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); - accum.add(GetInputState(), BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + rng.add_entropy_T(::GetTickCount()); + rng.add_entropy_T(::GetMessagePos()); + rng.add_entropy_T(::GetMessageTime()); + rng.add_entropy_T(::GetInputState()); - accum.add(GetCurrentProcessId(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); - accum.add(GetCurrentThreadId(), BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); + rng.add_entropy_T(::GetCurrentProcessId()); + rng.add_entropy_T(::GetCurrentThreadId()); SYSTEM_INFO sys_info; - GetSystemInfo(&sys_info); - accum.add(sys_info, BOTAN_ENTROPY_ESTIMATE_STATIC_SYSTEM_DATA); + ::GetSystemInfo(&sys_info); + rng.add_entropy_T(sys_info); MEMORYSTATUSEX mem_info; - GlobalMemoryStatusEx(&mem_info); - accum.add(mem_info, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + ::GlobalMemoryStatusEx(&mem_info); + rng.add_entropy_T(mem_info); POINT point; - GetCursorPos(&point); - accum.add(point, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + ::GetCursorPos(&point); + rng.add_entropy_T(point); - GetCaretPos(&point); - accum.add(point, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); + ::GetCaretPos(&point); + rng.add_entropy_T(point); /* - Now use the Tooltip library to iterate throug various objects on + 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); + HANDLE snapshot = ::CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0); + size_t bits = 0; #define TOOLHELP32_ITER(DATA_TYPE, FUNC_FIRST, FUNC_NEXT) \ - if(!accum.polling_finished()) \ + if(bits < 256) \ { \ DATA_TYPE info; \ info.dwSize = sizeof(DATA_TYPE); \ @@ -59,57 +59,52 @@ void Win32_EntropySource::poll(Entropy_Accumulator& accum) { \ do \ { \ - accum.add(info, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); \ + rng.add_entropy_T(info); \ + bits += 4; \ } while(FUNC_NEXT(snapshot, &info)); \ } \ } - TOOLHELP32_ITER(MODULEENTRY32, Module32First, Module32Next); - TOOLHELP32_ITER(PROCESSENTRY32, Process32First, Process32Next); - TOOLHELP32_ITER(THREADENTRY32, Thread32First, Thread32Next); + TOOLHELP32_ITER(MODULEENTRY32, ::Module32First, ::Module32Next); + TOOLHELP32_ITER(PROCESSENTRY32, ::Process32First, ::Process32Next); + TOOLHELP32_ITER(THREADENTRY32, ::Thread32First, ::Thread32Next); #undef TOOLHELP32_ITER - if(!accum.polling_finished()) + if(bits <= 256) { HEAPLIST32 heap_list; heap_list.dwSize = sizeof(HEAPLIST32); - const size_t HEAP_LISTS_MAX = 32; - const size_t HEAP_OBJS_PER_LIST = 128; - - if(Heap32ListFirst(snapshot, &heap_list)) + if(::Heap32ListFirst(snapshot, &heap_list)) { - size_t heap_lists_found = 0; do { - accum.add(heap_list, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); - - if(++heap_lists_found > HEAP_LISTS_MAX) - break; + rng.add_entropy_T(heap_list); HEAPENTRY32 heap_entry; heap_entry.dwSize = sizeof(HEAPENTRY32); - if(Heap32First(&heap_entry, heap_list.th32ProcessID, - heap_list.th32HeapID)) + if(::Heap32First(&heap_entry, + heap_list.th32ProcessID, + heap_list.th32HeapID)) { - size_t heap_objs_found = 0; do { - if(heap_objs_found++ > HEAP_OBJS_PER_LIST) - break; - accum.add(heap_entry, BOTAN_ENTROPY_ESTIMATE_SYSTEM_DATA); - } while(Heap32Next(&heap_entry)); + rng.add_entropy_T(heap_entry); + bits += 4; + } while(::Heap32Next(&heap_entry)); } - if(accum.polling_finished()) + if(bits >= 256) break; - } while(Heap32ListNext(snapshot, &heap_list)); + } while(::Heap32ListNext(snapshot, &heap_list)); } } - CloseHandle(snapshot); + ::CloseHandle(snapshot); + + return bits; } } diff --git a/src/lib/entropy/win32_stats/es_win32.h b/src/lib/entropy/win32_stats/es_win32.h index 5dc3f7f17..26b904bbb 100644 --- a/src/lib/entropy/win32_stats/es_win32.h +++ b/src/lib/entropy/win32_stats/es_win32.h @@ -19,7 +19,7 @@ class Win32_EntropySource final : public Entropy_Source { public: std::string name() const override { return "system_stats"; } - void poll(Entropy_Accumulator& accum) override; + size_t poll(RandomNumberGenerator& rng) override; }; } diff --git a/src/lib/ffi/ffi.cpp b/src/lib/ffi/ffi.cpp index 11084ae50..e42f32234 100644 --- a/src/lib/ffi/ffi.cpp +++ b/src/lib/ffi/ffi.cpp @@ -287,7 +287,7 @@ int botan_rng_get(botan_rng_t rng, uint8_t* out, size_t out_len) int botan_rng_reseed(botan_rng_t rng, size_t bits) { - return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { r.reseed(bits); }); + return BOTAN_FFI_DO(Botan::RandomNumberGenerator, rng, r, { r.reseed_from_rng(Botan::system_rng(), bits); }); } int botan_hash_init(botan_hash_t* hash, const char* hash_name, uint32_t flags) @@ -653,12 +653,13 @@ int botan_pbkdf_timed(const char* pbkdf_algo, 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 salt[], size_t salt_len, + const uint8_t label[], size_t label_len) { try { std::unique_ptr<Botan::KDF> kdf(Botan::get_kdf(kdf_algo)); - kdf->kdf(out, out_len, secret, secret_len, salt, salt_len); + kdf->kdf(out, out_len, secret, secret_len, salt, salt_len, label, label_len); return 0; } catch(std::exception& e) diff --git a/src/lib/ffi/ffi.h b/src/lib/ffi/ffi.h index 6cbe56743..165554105 100644 --- a/src/lib/ffi/ffi.h +++ b/src/lib/ffi/ffi.h @@ -269,7 +269,8 @@ BOTAN_DLL int botan_pbkdf_timed(const char* pbkdf_algo, BOTAN_DLL 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 salt[], size_t salt_len, + const uint8_t label[], size_t label_len); /* * Bcrypt diff --git a/src/lib/ffi/info.txt b/src/lib/ffi/info.txt index 7c8968ff0..057bbd012 100644 --- a/src/lib/ffi/info.txt +++ b/src/lib/ffi/info.txt @@ -7,7 +7,6 @@ pbkdf pubkey x509 #tls -auto_rng system_rng </requires> diff --git a/src/lib/hash/par_hash/par_hash.cpp b/src/lib/hash/par_hash/par_hash.cpp index 5645a99c7..f6bed96ee 100644 --- a/src/lib/hash/par_hash/par_hash.cpp +++ b/src/lib/hash/par_hash/par_hash.cpp @@ -68,7 +68,7 @@ HashFunction* Parallel::clone() const std::vector<HashFunction*> hash_copies; for(auto&& hash : m_hashes) - hash_copies.push_back(hash->clone()); + hash_copies.push_back(hash.get()); return new Parallel(hash_copies); } diff --git a/src/lib/kdf/hkdf/hkdf.cpp b/src/lib/kdf/hkdf/hkdf.cpp index 6f83853f9..56dc72f09 100644 --- a/src/lib/kdf/hkdf/hkdf.cpp +++ b/src/lib/kdf/hkdf/hkdf.cpp @@ -22,7 +22,8 @@ HKDF* HKDF::make(const Spec& spec) size_t HKDF::kdf(byte out[], size_t out_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { m_prf->set_key(secret, secret_len); @@ -33,6 +34,7 @@ size_t HKDF::kdf(byte out[], size_t out_len, while(offset != out_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); diff --git a/src/lib/kdf/hkdf/hkdf.h b/src/lib/kdf/hkdf/hkdf.h index 3e3e2b73a..1dba82ee2 100644 --- a/src/lib/kdf/hkdf/hkdf.h +++ b/src/lib/kdf/hkdf/hkdf.h @@ -31,7 +31,8 @@ class BOTAN_DLL HKDF final : public KDF size_t kdf(byte out[], size_t out_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; private: std::unique_ptr<MessageAuthenticationCode> m_prf; diff --git a/src/lib/kdf/kdf.cpp b/src/lib/kdf/kdf.cpp index 7f4488d32..66296bf96 100644 --- a/src/lib/kdf/kdf.cpp +++ b/src/lib/kdf/kdf.cpp @@ -21,6 +21,10 @@ #include <botan/kdf2.h> #endif +#if defined(BOTAN_HAS_KDF1_18033) +#include <botan/kdf1_iso18033.h> +#endif + #if defined(BOTAN_HAS_TLS_V10_PRF) #include <botan/prf_tls.h> #endif @@ -89,6 +93,10 @@ BOTAN_REGISTER_KDF_1HASH(KDF1, "KDF1"); BOTAN_REGISTER_KDF_1HASH(KDF2, "KDF2"); #endif +#if defined(BOTAN_HAS_KDF1_18033) +BOTAN_REGISTER_KDF_1HASH( KDF1_18033, "KDF1-18033" ); +#endif + #if defined(BOTAN_HAS_TLS_V10_PRF) BOTAN_REGISTER_KDF_NOARGS(TLS_PRF, "TLS-PRF"); #endif diff --git a/src/lib/kdf/kdf.h b/src/lib/kdf/kdf.h index 88b50c8b8..3c8a7a013 100644 --- a/src/lib/kdf/kdf.h +++ b/src/lib/kdf/kdf.h @@ -40,7 +40,8 @@ class BOTAN_DLL KDF virtual size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const = 0; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const = 0; /** @@ -50,15 +51,19 @@ class BOTAN_DLL KDF * @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 */ secure_vector<byte> derive_key(size_t key_len, const byte secret[], size_t secret_len, const byte salt[], - size_t salt_len) const + size_t salt_len, + const byte label[] = nullptr, + size_t label_len = 0) const { secure_vector<byte> key(key_len); - key.resize(kdf(key.data(), key.size(), secret, secret_len, salt, salt_len)); + key.resize(kdf(key.data(), key.size(), secret, secret_len, salt, salt_len, label, label_len)); return key; } @@ -67,14 +72,19 @@ class BOTAN_DLL KDF * @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 */ secure_vector<byte> derive_key(size_t key_len, const secure_vector<byte>& secret, - const std::string& salt = "") const + const std::string& salt = "", + const std::string& label = "") const { return derive_key(key_len, secret.data(), secret.size(), reinterpret_cast<const byte*>(salt.data()), - salt.length()); + salt.length(), + reinterpret_cast<const byte*>(label.data()), + label.length()); + } /** @@ -82,15 +92,18 @@ class BOTAN_DLL KDF * @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 */ - template<typename Alloc, typename Alloc2> + template<typename Alloc, typename Alloc2, typename Alloc3> secure_vector<byte> derive_key(size_t key_len, const std::vector<byte, Alloc>& secret, - const std::vector<byte, Alloc2>& salt) const + const std::vector<byte, Alloc2>& salt, + const std::vector<byte, Alloc3>& label) const { return derive_key(key_len, secret.data(), secret.size(), - salt.data(), salt.size()); + salt.data(), salt.size(), + label.data(), label.size()); } /** @@ -99,15 +112,19 @@ class BOTAN_DLL KDF * @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 */ secure_vector<byte> derive_key(size_t key_len, const secure_vector<byte>& secret, const byte salt[], - size_t salt_len) const + size_t salt_len, + const std::string& label = "") const { return derive_key(key_len, secret.data(), secret.size(), - salt, salt_len); + salt, salt_len, + reinterpret_cast<const byte*>(label.data()), + label.size()); } /** @@ -116,15 +133,19 @@ class BOTAN_DLL KDF * @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 */ secure_vector<byte> derive_key(size_t key_len, const byte secret[], size_t secret_len, - const std::string& salt = "") const + const std::string& salt = "", + const std::string& label = "") const { return derive_key(key_len, secret, secret_len, reinterpret_cast<const byte*>(salt.data()), - salt.length()); + salt.length(), + reinterpret_cast<const byte*>(label.data()), + label.length()); } virtual KDF* clone() const = 0; diff --git a/src/lib/kdf/kdf1/kdf1.cpp b/src/lib/kdf/kdf1/kdf1.cpp index c7ea3c37e..14dddc5f4 100644 --- a/src/lib/kdf/kdf1/kdf1.cpp +++ b/src/lib/kdf/kdf1/kdf1.cpp @@ -11,9 +11,11 @@ namespace Botan { size_t KDF1::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte 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()) diff --git a/src/lib/kdf/kdf1/kdf1.h b/src/lib/kdf/kdf1/kdf1.h index adaa84894..59bff4d8d 100644 --- a/src/lib/kdf/kdf1/kdf1.h +++ b/src/lib/kdf/kdf1/kdf1.h @@ -25,7 +25,8 @@ class BOTAN_DLL KDF1 final : public KDF size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; explicit KDF1(HashFunction* h) : m_hash(h) {} private: diff --git a/src/lib/kdf/kdf1_iso18033/info.txt b/src/lib/kdf/kdf1_iso18033/info.txt new file mode 100644 index 000000000..507a04561 --- /dev/null +++ b/src/lib/kdf/kdf1_iso18033/info.txt @@ -0,0 +1 @@ +define KDF1_18033 20160128 diff --git a/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.cpp b/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.cpp new file mode 100644 index 000000000..7beca0862 --- /dev/null +++ b/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.cpp @@ -0,0 +1,37 @@ +/* +* KDF1 from ISO 18033-2 +* (C) 2016 Philipp Weber +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/kdf1_iso18033.h> + +namespace Botan { + +size_t KDF1_18033::kdf(byte key[], size_t key_len, + const byte secret[], size_t secret_len, + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const + { + u32bit counter = 0; + secure_vector<byte> 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; + } + +} diff --git a/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.h b/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.h new file mode 100644 index 000000000..f61864d1f --- /dev/null +++ b/src/lib/kdf/kdf1_iso18033/kdf1_iso18033.h @@ -0,0 +1,38 @@ +/* +* 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 <botan/kdf.h> +#include <botan/hash.h> + +namespace Botan { + +/** +* KDF1, from ISO 18033-2 +*/ +class BOTAN_DLL KDF1_18033 : 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(byte key[], size_t key_len, + const byte secret[], size_t secret_len, + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; + + KDF1_18033(HashFunction* h) : m_hash(h) {} + private: + std::unique_ptr<HashFunction> m_hash; + }; + +} + +#endif diff --git a/src/lib/kdf/kdf2/kdf2.cpp b/src/lib/kdf/kdf2/kdf2.cpp index df2b7a91c..760ebfc83 100644 --- a/src/lib/kdf/kdf2/kdf2.cpp +++ b/src/lib/kdf/kdf2/kdf2.cpp @@ -11,7 +11,8 @@ namespace Botan { size_t KDF2::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { u32bit counter = 1; secure_vector<byte> h; @@ -21,6 +22,7 @@ size_t KDF2::kdf(byte key[], size_t key_len, { 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); diff --git a/src/lib/kdf/kdf2/kdf2.h b/src/lib/kdf/kdf2/kdf2.h index 7403df21c..600f7c91c 100644 --- a/src/lib/kdf/kdf2/kdf2.h +++ b/src/lib/kdf/kdf2/kdf2.h @@ -25,7 +25,8 @@ class BOTAN_DLL KDF2 final : public KDF size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; explicit KDF2(HashFunction* h) : m_hash(h) {} private: diff --git a/src/lib/kdf/prf_tls/prf_tls.cpp b/src/lib/kdf/prf_tls/prf_tls.cpp index 547b0c9c8..14b330901 100644 --- a/src/lib/kdf/prf_tls/prf_tls.cpp +++ b/src/lib/kdf/prf_tls/prf_tls.cpp @@ -73,23 +73,36 @@ void P_hash(byte out[], size_t out_len, size_t TLS_PRF::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { const size_t S1_len = (secret_len + 1) / 2, S2_len = (secret_len + 1) / 2; const byte* S1 = secret; const byte* S2 = secret + (secret_len - S2_len); + secure_vector<byte> msg; - P_hash(key, key_len, *m_hmac_md5, S1, S1_len, salt, salt_len); - P_hash(key, key_len, *m_hmac_sha1, S2, S2_len, salt, salt_len); + 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(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { - P_hash(key, key_len, *m_mac, secret, secret_len, salt, salt_len); + secure_vector<byte> 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; } diff --git a/src/lib/kdf/prf_tls/prf_tls.h b/src/lib/kdf/prf_tls/prf_tls.h index a51006d88..37a517125 100644 --- a/src/lib/kdf/prf_tls/prf_tls.h +++ b/src/lib/kdf/prf_tls/prf_tls.h @@ -25,7 +25,8 @@ class BOTAN_DLL TLS_PRF final : public KDF size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; TLS_PRF(); private: @@ -45,7 +46,8 @@ class BOTAN_DLL TLS_12_PRF final : public KDF size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; explicit TLS_12_PRF(MessageAuthenticationCode* mac) : m_mac(mac) {} diff --git a/src/lib/kdf/prf_x942/prf_x942.cpp b/src/lib/kdf/prf_x942/prf_x942.cpp index fb8de1e85..206cf6ce6 100644 --- a/src/lib/kdf/prf_x942/prf_x942.cpp +++ b/src/lib/kdf/prf_x942/prf_x942.cpp @@ -30,15 +30,21 @@ std::vector<byte> encode_x942_int(u32bit n) size_t X942_PRF::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { std::unique_ptr<HashFunction> hash(HashFunction::create("SHA-160")); const OID kek_algo(m_key_wrap_oid); secure_vector<byte> h; + secure_vector<byte> in; size_t offset = 0; u32bit 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); @@ -54,7 +60,7 @@ size_t X942_PRF::kdf(byte key[], size_t key_len, .encode_if(salt_len != 0, DER_Encoder() .start_explicit(0) - .encode(salt, salt_len, OCTET_STRING) + .encode(in, OCTET_STRING) .end_explicit() ) diff --git a/src/lib/kdf/prf_x942/prf_x942.h b/src/lib/kdf/prf_x942/prf_x942.h index c15be9845..afe56de80 100644 --- a/src/lib/kdf/prf_x942/prf_x942.h +++ b/src/lib/kdf/prf_x942/prf_x942.h @@ -24,7 +24,8 @@ class BOTAN_DLL X942_PRF final : public KDF size_t kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; explicit X942_PRF(const std::string& oid); private: diff --git a/src/lib/kdf/sp800_108/sp800_108.cpp b/src/lib/kdf/sp800_108/sp800_108.cpp index 873db814c..aafb349b2 100644 --- a/src/lib/kdf/sp800_108/sp800_108.cpp +++ b/src/lib/kdf/sp800_108/sp800_108.cpp @@ -8,6 +8,8 @@ #include <botan/sp800_108.h> #include <botan/hmac.h> +#include <iterator> + namespace Botan { SP800_108_Counter* SP800_108_Counter::make(const Spec& spec) @@ -23,13 +25,18 @@ SP800_108_Counter* SP800_108_Counter::make(const Spec& spec) size_t SP800_108_Counter::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { const std::size_t prf_len = m_prf->output_length(); + const byte delim = 0; byte *p = key; uint32_t counter = 1; + uint32_t length = key_len * 8; + byte be_len[4] = { 0 }; secure_vector<byte> tmp; + store_be(length, be_len); m_prf->set_key(secret, secret_len); while(p < key + key_len && counter != 0) @@ -40,7 +47,10 @@ size_t SP800_108_Counter::kdf(byte key[], size_t key_len, store_be(counter, be_cnt); m_prf->update(be_cnt,4); - m_prf->update(salt, salt_len); + 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); std::move(tmp.begin(), tmp.begin() + to_copy, p); @@ -68,16 +78,21 @@ SP800_108_Feedback* SP800_108_Feedback::make(const Spec& spec) size_t SP800_108_Feedback::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { const std::size_t prf_len = m_prf->output_length(); const std::size_t iv_len = (salt_len >= prf_len ? prf_len : 0); + const byte delim = 0; byte *p = key; uint32_t counter = 1; + uint32_t length = key_len * 8; + byte be_len[4] = { 0 }; secure_vector< byte > prev(salt, salt + iv_len); secure_vector< byte > 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) @@ -89,7 +104,10 @@ size_t SP800_108_Feedback::kdf(byte key[], size_t key_len, 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); std::copy(prev.begin(), prev.begin() + to_copy, p); @@ -117,15 +135,27 @@ SP800_108_Pipeline* SP800_108_Pipeline::make(const Spec& spec) size_t SP800_108_Pipeline::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { const std::size_t prf_len = m_prf->output_length(); + const byte delim = 0; + byte *p = key; uint32_t counter = 1; - secure_vector<byte> ai(salt, salt + salt_len), ki; + uint32_t length = key_len * 8; + byte be_len[4] = { 0 }; + secure_vector<byte> 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) @@ -140,7 +170,10 @@ size_t SP800_108_Pipeline::kdf(byte key[], size_t key_len, 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); std::copy(ki.begin(), ki.begin() + to_copy, p); diff --git a/src/lib/kdf/sp800_108/sp800_108.h b/src/lib/kdf/sp800_108/sp800_108.h index 0acdfacf9..71a918c15 100644 --- a/src/lib/kdf/sp800_108/sp800_108.h +++ b/src/lib/kdf/sp800_108/sp800_108.h @@ -23,9 +23,27 @@ class BOTAN_DLL SP800_108_Counter : public KDF 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(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; SP800_108_Counter(MessageAuthenticationCode* mac) : m_prf(mac) {} @@ -44,9 +62,27 @@ class BOTAN_DLL SP800_108_Feedback : public KDF 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(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; SP800_108_Feedback(MessageAuthenticationCode* mac) : m_prf(mac) {} @@ -65,9 +101,27 @@ class BOTAN_DLL SP800_108_Pipeline : public KDF 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(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; SP800_108_Pipeline(MessageAuthenticationCode* mac) : m_prf(mac) {} diff --git a/src/lib/kdf/sp800_56c/sp800_56c.cpp b/src/lib/kdf/sp800_56c/sp800_56c.cpp index 664d32b30..338feba2a 100644 --- a/src/lib/kdf/sp800_56c/sp800_56c.cpp +++ b/src/lib/kdf/sp800_56c/sp800_56c.cpp @@ -27,17 +27,18 @@ SP800_56C* SP800_56C::make(const Spec& spec) size_t SP800_56C::kdf(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const { // Randomness Extraction - secure_vector< byte > k_dk, context; + secure_vector< byte > 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(), context.data(), context.size()); + m_exp->kdf(key, key_len, k_dk.data(), k_dk.size(), nullptr, 0, label, label_len); return key_len; } diff --git a/src/lib/kdf/sp800_56c/sp800_56c.h b/src/lib/kdf/sp800_56c/sp800_56c.h index d1b6f39b5..1281ed314 100644 --- a/src/lib/kdf/sp800_56c/sp800_56c.h +++ b/src/lib/kdf/sp800_56c/sp800_56c.h @@ -23,9 +23,27 @@ class BOTAN_DLL SP800_56C : public KDF 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(byte key[], size_t key_len, const byte secret[], size_t secret_len, - const byte salt[], size_t salt_len) const override; + const byte salt[], size_t salt_len, + const byte label[], size_t label_len) const override; SP800_56C(MessageAuthenticationCode* mac, KDF* exp) : m_prf(mac), m_exp(exp) {} diff --git a/src/lib/mac/siphash/siphash.cpp b/src/lib/mac/siphash/siphash.cpp index 4a9ffe8ea..cb72f771c 100644 --- a/src/lib/mac/siphash/siphash.cpp +++ b/src/lib/mac/siphash/siphash.cpp @@ -85,9 +85,7 @@ void SipHash::final_result(byte mac[]) store_le(X, mac); - m_mbuf = 0; - m_mbuf_pos = 0; - m_words = 0; + clear(); } void SipHash::key_schedule(const byte key[], size_t) @@ -105,6 +103,9 @@ void SipHash::key_schedule(const byte key[], size_t) void SipHash::clear() { m_V.clear(); + m_mbuf = 0; + m_mbuf_pos = 0; + m_words = 0; } std::string SipHash::name() const diff --git a/src/lib/math/bigint/big_code.cpp b/src/lib/math/bigint/big_code.cpp index 299fdc246..c8687715d 100644 --- a/src/lib/math/bigint/big_code.cpp +++ b/src/lib/math/bigint/big_code.cpp @@ -98,6 +98,17 @@ void BigInt::encode_1363(byte output[], size_t bytes, const BigInt& n) } /* +* Encode two BigInt, with leading 0s if needed, and concatenate +*/ +secure_vector<byte> BigInt::encode_fixed_length_int_pair(const BigInt& n1, const BigInt& n2, size_t bytes) + { + secure_vector<byte> 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 byte buf[], size_t length, Base base) diff --git a/src/lib/math/bigint/big_ops2.cpp b/src/lib/math/bigint/big_ops2.cpp index 9a3408247..6e234f036 100644 --- a/src/lib/math/bigint/big_ops2.cpp +++ b/src/lib/math/bigint/big_ops2.cpp @@ -1,6 +1,7 @@ /* * BigInt Assignment Operators * (C) 1999-2007 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -118,10 +119,7 @@ BigInt& BigInt::operator*=(const BigInt& y) secure_vector<word> z(data(), data() + x_sw); secure_vector<word> workspace(size()); - - bigint_mul(mutable_data(), size(), workspace.data(), - z.data(), z.size(), x_sw, - y.data(), y.size(), y_sw); + bigint_mul(*this, BigInt(*this), y, workspace.data()); } return (*this); diff --git a/src/lib/math/bigint/big_ops3.cpp b/src/lib/math/bigint/big_ops3.cpp index 6cf837020..24927b4fc 100644 --- a/src/lib/math/bigint/big_ops3.cpp +++ b/src/lib/math/bigint/big_ops3.cpp @@ -1,6 +1,7 @@ /* * BigInt Binary Operators * (C) 1999-2007 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -93,9 +94,7 @@ BigInt operator*(const BigInt& x, const BigInt& y) else if(x_sw && y_sw) { secure_vector<word> workspace(z.size()); - bigint_mul(z.mutable_data(), z.size(), workspace.data(), - x.data(), x.size(), x_sw, - y.data(), y.size(), y_sw); + bigint_mul(z, x, y, workspace.data()); } if(x_sw && y_sw && x.sign() != y.sign()) diff --git a/src/lib/math/bigint/bigint.h b/src/lib/math/bigint/bigint.h index 2963ba35d..a61bee39c 100644 --- a/src/lib/math/bigint/bigint.h +++ b/src/lib/math/bigint/bigint.h @@ -566,6 +566,15 @@ class BOTAN_DLL BigInt static void encode_1363(byte 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<byte> containing the concatenation of the two encoded BigInt + */ + static secure_vector<byte> encode_fixed_length_int_pair(const BigInt& n1, const BigInt& n2, size_t bytes); + private: secure_vector<word> m_reg; Sign m_signedness = Positive; diff --git a/src/lib/math/ec_gfp/curve_gfp.cpp b/src/lib/math/ec_gfp/curve_gfp.cpp index 9bf2191c6..96593e601 100644 --- a/src/lib/math/ec_gfp/curve_gfp.cpp +++ b/src/lib/math/ec_gfp/curve_gfp.cpp @@ -1,6 +1,7 @@ /* * 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) */ @@ -80,20 +81,14 @@ void CurveGFp_Montgomery::curve_mul(BigInt& z, const BigInt& x, const BigInt& y, return; } - const size_t x_sw = x.sig_words(); - const size_t y_sw = y.sig_words(); - 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.mutable_data(), output_size, - x.data(), x.size(), x_sw, - y.data(), y.size(), y_sw, - m_p.data(), m_p_words, m_p_dash, - ws.data()); + 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, @@ -115,9 +110,7 @@ void CurveGFp_Montgomery::curve_sqr(BigInt& z, const BigInt& x, z.grow_to(output_size); z.clear(); - bigint_monty_sqr(z.mutable_data(), output_size, - x.data(), x.size(), x_sw, - m_p.data(), m_p_words, m_p_dash, + bigint_monty_sqr(z, x, m_p.data(), m_p_words, m_p_dash, ws.data()); } @@ -174,9 +167,7 @@ void CurveGFp_NIST::curve_mul(BigInt& z, const BigInt& x, const BigInt& y, z.grow_to(output_size); z.clear(); - bigint_mul(z.mutable_data(), output_size, ws.data(), - x.data(), x.size(), x.sig_words(), - y.data(), y.size(), y.sig_words()); + bigint_mul(z, x, y, ws.data()); this->redc(z, ws); } diff --git a/src/lib/math/mp/info.txt b/src/lib/math/mp/info.txt index 6aa0142f3..b5db12648 100644 --- a/src/lib/math/mp/info.txt +++ b/src/lib/math/mp/info.txt @@ -1,12 +1,10 @@ define BIGINT_MP 20151225 <source> -mp_asm.cpp +mp_core.cpp mp_comba.cpp mp_karat.cpp mp_monty.cpp -mp_misc.cpp -mp_shift.cpp </source> <header:public> @@ -15,8 +13,6 @@ mp_types.h <header:internal> mp_core.h +mp_madd.h +mp_asmi.h </header:internal> - -<requires> -mp_x86_64|mp_x86_32|mp_x86_32_msvc|mp_generic -</requires> diff --git a/src/lib/math/mp/mp_asmi.h b/src/lib/math/mp/mp_asmi.h new file mode 100644 index 000000000..afb4d1407 --- /dev/null +++ b/src/lib/math/mp/mp_asmi.h @@ -0,0 +1,820 @@ +/* +* 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 <botan/internal/mp_madd.h> + +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 diff --git a/src/lib/math/mp/mp_asm.cpp b/src/lib/math/mp/mp_core.cpp index cfbb027d7..2a0b08f67 100644 --- a/src/lib/math/mp/mp_asm.cpp +++ b/src/lib/math/mp/mp_core.cpp @@ -8,7 +8,6 @@ #include <botan/internal/mp_core.h> #include <botan/internal/mp_asmi.h> -#include <botan/internal/mp_core.h> #include <botan/internal/ct_utils.h> #include <botan/exceptn.h> #include <botan/mem_ops.h> @@ -253,4 +252,189 @@ void bigint_linmul3(word z[], const word x[], size_t x_size, word y) 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 +*/ +s32bit 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"); + + 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; + } + +/* +* 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); + } + } diff --git a/src/lib/math/mp/mp_core.h b/src/lib/math/mp/mp_core.h index 73f13742c..c4ce005ba 100644 --- a/src/lib/math/mp/mp_core.h +++ b/src/lib/math/mp/mp_core.h @@ -2,6 +2,7 @@ * MPI Algorithms * (C) 1999-2010 Jack Lloyd * 2006 Luca Piccarreta +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,6 +10,7 @@ #ifndef BOTAN_MP_CORE_OPS_H__ #define BOTAN_MP_CORE_OPS_H__ +#include <botan/bigint.h> #include <botan/mp_types.h> namespace Botan { @@ -134,17 +136,14 @@ void bigint_monty_redc(word z[], /* * Montgomery Multiplication */ -void bigint_monty_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, +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(word z[], size_t z_size, - const word x[], size_t x_size, size_t x_sw, +void bigint_monty_sqr(BigInt& z, const BigInt& x, const word p[], size_t p_size, word p_dash, word workspace[]); @@ -182,9 +181,7 @@ void bigint_comba_sqr16(word out[32], const word in[16]); /* * High Level Multiplication/Squaring Interfaces */ -void bigint_mul(word z[], size_t z_size, word workspace[], - const word x[], size_t x_size, size_t x_sw, - const word y[], size_t y_size, size_t y_sw); +void bigint_mul(BigInt& z, const BigInt& x, const BigInt& y, word workspace[]); void bigint_sqr(word z[], size_t z_size, word workspace[], const word x[], size_t x_size, size_t x_sw); diff --git a/src/lib/math/mp/mp_generic/info.txt b/src/lib/math/mp/mp_generic/info.txt deleted file mode 100644 index c87dd00ca..000000000 --- a/src/lib/math/mp/mp_generic/info.txt +++ /dev/null @@ -1,6 +0,0 @@ -load_on dep - -<header:internal> -mp_madd.h -mp_asmi.h -</header:internal> diff --git a/src/lib/math/mp/mp_generic/mp_asmi.h b/src/lib/math/mp/mp_generic/mp_asmi.h deleted file mode 100644 index 708afdfa0..000000000 --- a/src/lib/math/mp/mp_generic/mp_asmi.h +++ /dev/null @@ -1,203 +0,0 @@ -/* -* 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 <botan/internal/mp_madd.h> - -namespace Botan { - -/* -* Word Addition -*/ -inline word word_add(word x, word y, word* carry) - { - word z = x + y; - word c1 = (z < x); - z += *carry; - *carry = c1 | (z < *carry); - return z; - } - -/* -* Eight Word Block Addition, Two Argument -*/ -inline word word8_add2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Addition, Three Argument -*/ -inline word word8_add3(word z[8], const word x[8], - const word y[8], word carry) - { - 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; - } - -/* -* Word Subtraction -*/ -inline word word_sub(word x, word y, word* carry) - { - word t0 = x - y; - word c1 = (t0 > x); - word z = t0 - *carry; - *carry = c1 | (z > t0); - return z; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2_rev(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Three Argument -*/ -inline word word8_sub3(word z[8], const word x[8], - const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul2(word x[8], word y, word carry) - { - 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; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Eight Word Block Multiply/Add -*/ -inline word word8_madd3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) - { - word carry = *w0; - *w0 = word_madd2(a, b, &carry); - *w1 += carry; - *w2 += (*w1 < carry) ? 1 : 0; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) - { - word carry = 0; - a = word_madd2(a, b, &carry); - b = carry; - - word top = (b >> (BOTAN_MP_WORD_BITS-1)); - b <<= 1; - b |= (a >> (BOTAN_MP_WORD_BITS-1)); - a <<= 1; - - carry = 0; - *w0 = word_add(*w0, a, &carry); - *w1 = word_add(*w1, b, &carry); - *w2 = word_add(*w2, top, &carry); - } - -} - -#endif diff --git a/src/lib/math/mp/mp_karat.cpp b/src/lib/math/mp/mp_karat.cpp index 9135fdd6a..7a763e2a9 100644 --- a/src/lib/math/mp/mp_karat.cpp +++ b/src/lib/math/mp/mp_karat.cpp @@ -1,6 +1,7 @@ /* * Multiplication and Squaring * (C) 1999-2010 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -252,60 +253,55 @@ size_t karatsuba_size(size_t z_size, size_t x_size, size_t x_sw) /* * Multiplication Algorithm Dispatcher */ -void bigint_mul(word z[], size_t z_size, word workspace[], - const word x[], size_t x_size, size_t x_sw, - const word y[], size_t y_size, size_t y_sw) +void bigint_mul(BigInt& z, const BigInt& x, const BigInt& y, word workspace[]) { - // checking that z_size >= x_sw + y_sw without overflow - BOTAN_ASSERT(z_size > x_sw && z_size > y_sw && z_size-x_sw >= y_sw, "Output size is sufficient"); - - if(x_sw == 1) + if(x.sig_words() == 1) { - bigint_linmul3(z, y, y_sw, x[0]); + bigint_linmul3(z.mutable_data(), y.data(), y.sig_words(), x.data()[0]); } - else if(y_sw == 1) + else if(y.sig_words() == 1) { - bigint_linmul3(z, x, x_sw, y[0]); + bigint_linmul3(z.mutable_data(), x.data(), x.sig_words(), y.data()[0]); } - else if(x_sw <= 4 && x_size >= 4 && - y_sw <= 4 && y_size >= 4 && z_size >= 8) + else if(x.sig_words() <= 4 && x.size() >= 4 && + y.sig_words() <= 4 && y.size() >= 4 && z.size() >= 8) { - bigint_comba_mul4(z, x, y); + bigint_comba_mul4(z.mutable_data(), x.data(), y.data()); } - else if(x_sw <= 6 && x_size >= 6 && - y_sw <= 6 && y_size >= 6 && z_size >= 12) + else if(x.sig_words() <= 6 && x.size() >= 6 && + y.sig_words() <= 6 && y.size() >= 6 && z.size() >= 12) { - bigint_comba_mul6(z, x, y); + bigint_comba_mul6(z.mutable_data(), x.data(), y.data()); } - else if(x_sw <= 8 && x_size >= 8 && - y_sw <= 8 && y_size >= 8 && z_size >= 16) + else if(x.sig_words() <= 8 && x.size() >= 8 && + y.sig_words() <= 8 && y.size() >= 8 && z.size() >= 16) { - bigint_comba_mul8(z, x, y); + bigint_comba_mul8(z.mutable_data(), x.data(), y.data()); } - else if(x_sw <= 9 && x_size >= 9 && - y_sw <= 9 && y_size >= 9 && z_size >= 18) + else if(x.sig_words() <= 9 && x.size() >= 9 && + y.sig_words() <= 9 && y.size() >= 9 && z.size() >= 18) { - bigint_comba_mul9(z, x, y); + bigint_comba_mul9(z.mutable_data(), x.data(), y.data()); } - else if(x_sw <= 16 && x_size >= 16 && - y_sw <= 16 && y_size >= 16 && z_size >= 32) + else if(x.sig_words() <= 16 && x.size() >= 16 && + y.sig_words() <= 16 && y.size() >= 16 && z.size() >= 32) { - bigint_comba_mul16(z, x, y); + bigint_comba_mul16(z.mutable_data(), x.data(), y.data()); } - else if(x_sw < KARATSUBA_MULTIPLY_THRESHOLD || - y_sw < KARATSUBA_MULTIPLY_THRESHOLD || + else if(x.sig_words() < KARATSUBA_MULTIPLY_THRESHOLD || + y.sig_words() < KARATSUBA_MULTIPLY_THRESHOLD || !workspace) { - basecase_mul(z, x, x_sw, y, y_sw); + basecase_mul(z.mutable_data(), x.data(), x.sig_words(), y.data(), y.sig_words()); } else { - const size_t N = karatsuba_size(z_size, x_size, x_sw, y_size, y_sw); + const size_t N = karatsuba_size(z.size(), x.size(), x.sig_words(), y.size(), y.sig_words()); if(N) - karatsuba_mul(z, x, y, N, workspace); + karatsuba_mul(z.mutable_data(), x.data(), y.data(), N, workspace); else - basecase_mul(z, x, x_sw, y, y_sw); + basecase_mul(z.mutable_data(), x.data(), x.sig_words(), y.data(), y.sig_words()); } } diff --git a/src/lib/math/mp/mp_generic/mp_madd.h b/src/lib/math/mp/mp_madd.h index 95a1069a4..0567622d9 100644 --- a/src/lib/math/mp/mp_generic/mp_madd.h +++ b/src/lib/math/mp/mp_madd.h @@ -35,12 +35,52 @@ namespace Botan { #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_TARGET_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_HAS_MP_DWORD) +#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<dword>(a) * b + *c; *c = static_cast<word>(s >> BOTAN_MP_WORD_BITS); return static_cast<word>(s); @@ -64,7 +104,37 @@ inline word word_madd2(word a, word b, word* c) */ inline word word_madd3(word a, word b, word c, word* d) { -#if defined(BOTAN_HAS_MP_DWORD) +#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<dword>(a) * b + c + *d; *d = static_cast<word>(s >> BOTAN_MP_WORD_BITS); return static_cast<word>(s); @@ -86,6 +156,10 @@ inline word word_madd3(word a, word b, word c, word* d) #endif } +#if defined(ASM) + #undef ASM +#endif + } #endif diff --git a/src/lib/math/mp/mp_misc.cpp b/src/lib/math/mp/mp_misc.cpp deleted file mode 100644 index 768543a64..000000000 --- a/src/lib/math/mp/mp_misc.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* -* MP Misc Functions -* (C) 1999-2008 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/internal/mp_core.h> -#include <botan/internal/mp_madd.h> -#include <botan/exceptn.h> - -namespace Botan { - -/* -* Compare two MP integers -*/ -s32bit 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"); - - 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; - } - -/* -* 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); - } - -} diff --git a/src/lib/math/mp/mp_monty.cpp b/src/lib/math/mp/mp_monty.cpp index 7e427b540..88b5de715 100644 --- a/src/lib/math/mp/mp_monty.cpp +++ b/src/lib/math/mp/mp_monty.cpp @@ -2,10 +2,12 @@ * 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 <botan/bigint.h> #include <botan/internal/mp_core.h> #include <botan/internal/mp_madd.h> #include <botan/internal/mp_asmi.h> @@ -92,30 +94,25 @@ void bigint_monty_redc(word z[], BOTAN_ASSERT(borrow == 0 || borrow == 1, "Expected borrow"); } -void bigint_monty_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, +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[0], z_size, &ws[0], - &x[0], x_size, x_sw, - &y[0], y_size, y_sw); + bigint_mul(z, x, y, &ws[0]); - bigint_monty_redc(&z[0], + bigint_monty_redc(z.mutable_data(), &p[0], p_size, p_dash, &ws[0]); + } -void bigint_monty_sqr(word z[], size_t z_size, - const word x[], size_t x_size, size_t x_sw, - const word p[], size_t p_size, word p_dash, - word 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[0], z_size, &ws[0], - &x[0], x_size, x_sw); + bigint_sqr(z.mutable_data(), z.size(), &ws[0], + x.data(), x.size(), x.sig_words()); - bigint_monty_redc(&z[0], + bigint_monty_redc(z.mutable_data(), &p[0], p_size, p_dash, &ws[0]); } diff --git a/src/lib/math/mp/mp_shift.cpp b/src/lib/math/mp/mp_shift.cpp deleted file mode 100644 index 1850888a0..000000000 --- a/src/lib/math/mp/mp_shift.cpp +++ /dev/null @@ -1,133 +0,0 @@ -/* -* MP Shift Algorithms -* (C) 1999-2007,2014 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/internal/mp_core.h> -#include <botan/mem_ops.h> - -namespace Botan { - -/* -* 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)); - } - } - } - -} diff --git a/src/lib/math/mp/mp_x86_32/info.txt b/src/lib/math/mp/mp_x86_32/info.txt deleted file mode 100644 index f36abaf62..000000000 --- a/src/lib/math/mp/mp_x86_32/info.txt +++ /dev/null @@ -1,18 +0,0 @@ -load_on dep - -mp_bits 32 - -<header:internal> -mp_madd.h -mp_asmi.h -</header:internal> - -<arch> -x86_32 -</arch> - -<cc> -clang -gcc -icc -</cc> diff --git a/src/lib/math/mp/mp_x86_32/mp_asmi.h b/src/lib/math/mp/mp_x86_32/mp_asmi.h deleted file mode 100644 index 95af89fc0..000000000 --- a/src/lib/math/mp/mp_x86_32/mp_asmi.h +++ /dev/null @@ -1,236 +0,0 @@ -/* -* 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 <botan/internal/mp_madd.h> - -namespace Botan { - -/* -* Helper Macros for x86 Assembly -*/ -#ifndef ASM - #define ASM(x) x "\n\t" -#endif - -#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 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) - -#define ADD_OR_SUBTRACT(CORE_CODE) \ - ASM("rorl %[carry]") \ - CORE_CODE \ - ASM("sbbl %[carry],%[carry]") \ - ASM("negl %[carry]") - -/* -* Word Addition -*/ -inline word word_add(word x, word y, word* carry) - { - asm( - ADD_OR_SUBTRACT(ASM("adcl %[y],%[x]")) - : [x]"=r"(x), [carry]"=r"(*carry) - : "0"(x), [y]"rm"(y), "1"(*carry) - : "cc"); - return x; - } - -/* -* Eight Word Block Addition, Two Argument -*/ -inline word word8_add2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Addition, Three Argument -*/ -inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Word Subtraction -*/ -inline word word_sub(word x, word y, word* carry) - { - asm( - ADD_OR_SUBTRACT(ASM("sbbl %[y],%[x]")) - : [x]"=r"(x), [carry]"=r"(*carry) - : "0"(x), [y]"rm"(y), "1"(*carry) - : "cc"); - return x; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2_rev(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Three Argument -*/ -inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul2(word x[8], word y, word carry) - { - asm( - DO_8_TIMES(LINMUL_OP, "x") - : [carry]"=r"(carry) - : [x]"r"(x), [y]"rm"(y), "0"(carry) - : "cc", "%eax", "%edx"); - return carry; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Eight Word Block Multiply/Add -*/ -inline word word8_madd3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) - { - 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"); - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) - { - 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"); - } - -} - -#endif diff --git a/src/lib/math/mp/mp_x86_32/mp_madd.h b/src/lib/math/mp/mp_x86_32/mp_madd.h deleted file mode 100644 index 9c0990398..000000000 --- a/src/lib/math/mp/mp_x86_32/mp_madd.h +++ /dev/null @@ -1,63 +0,0 @@ -/* -* Lowest Level MPI Algorithms -* (C) 1999-2008 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 <botan/mp_types.h> - -#if (BOTAN_MP_WORD_BITS != 32) - #error The mp_x86_32 module requires that BOTAN_MP_WORD_BITS == 32 -#endif - -namespace Botan { - -/* -* Helper Macros for x86 Assembly -*/ -#define ASM(x) x "\n\t" - -/* -* Word Multiply -*/ -inline word word_madd2(word a, word b, word* c) - { - 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; - } - -/* -* Word Multiply/Add -*/ -inline word word_madd3(word a, word b, word c, word* d) - { - 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; - } - -} - -#endif diff --git a/src/lib/math/mp/mp_x86_32_msvc/info.txt b/src/lib/math/mp/mp_x86_32_msvc/info.txt deleted file mode 100644 index 3029d6a61..000000000 --- a/src/lib/math/mp/mp_x86_32_msvc/info.txt +++ /dev/null @@ -1,16 +0,0 @@ -mp_bits 32 - -load_on dep - -<header:internal> -mp_generic:mp_madd.h -mp_asmi.h -</header:internal> - -<arch> -x86_32 -</arch> - -<cc> -msvc -</cc> diff --git a/src/lib/math/mp/mp_x86_32_msvc/mp_asmi.h b/src/lib/math/mp/mp_x86_32_msvc/mp_asmi.h deleted file mode 100644 index 92bf7980d..000000000 --- a/src/lib/math/mp/mp_x86_32_msvc/mp_asmi.h +++ /dev/null @@ -1,454 +0,0 @@ -/* -* 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 <botan/internal/mp_madd.h> - -namespace Botan { - -/* -* Word Addition -*/ -inline word word_add(word x, word y, word* carry) - { - word z = x + y; - word c1 = (z < x); - z += *carry; - *carry = c1 | (z < *carry); - return z; - } - -/* -* Eight Word Block Addition, Two Argument -*/ -inline word word8_add2(word x[8], const word y[8], word carry) - { - __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 - } - } - -/* -* Eight Word Block Addition, Three Argument -*/ -inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) - { - __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 - } - } - -/* -* Word Subtraction -*/ -inline word word_sub(word x, word y, word* carry) - { - word t0 = x - y; - word c1 = (t0 > x); - word z = t0 - *carry; - *carry = c1 | (z > t0); - return z; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2(word x[8], const word y[8], word carry) - { - __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 - } - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2_rev(word x[8], const word y[8], word carry) - { - 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; - } - - -/* -* Eight Word Block Subtraction, Three Argument -*/ -inline word word8_sub3(word z[8], const word x[8], - const word y[8], word carry) - { - __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 - } - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul2(word x[8], word y, word carry) - { - __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 - } - } - -inline word word8_linmul3(word z[4], const word x[4], word y, word carry) - { - __asm { -#if 0 - //it's slower!!! - mov edx,[z] - mov eax,[x] - movd mm7,[y] - - movd mm0,[eax] - movd mm1,[eax+4] - movd mm2,[eax+8] - pmuludq mm0,mm7 - pmuludq mm1,mm7 - pmuludq mm2,mm7 - - movd mm6,[carry] - paddq mm0,mm6 - movd [edx],mm0 - - psrlq mm0,32 - paddq mm1,mm0 - movd [edx+4],mm1 - - movd mm3,[eax+12] - psrlq mm1,32 - paddq mm2,mm1 - movd [edx+8],mm2 - - pmuludq mm3,mm7 - movd mm4,[eax+16] - psrlq mm2,32 - paddq mm3,mm2 - movd [edx+12],mm3 - - pmuludq mm4,mm7 - movd mm5,[eax+20] - psrlq mm3,32 - paddq mm4,mm3 - movd [edx+16],mm4 - - pmuludq mm5,mm7 - movd mm0,[eax+24] - psrlq mm4,32 - paddq mm5,mm4 - movd [edx+20],mm5 - - pmuludq mm0,mm7 - movd mm1,[eax+28] - psrlq mm5,32 - paddq mm0,mm5 - movd [edx+24],mm0 - - pmuludq mm1,mm7 - psrlq mm0,32 - paddq mm1,mm0 - movd [edx+28],mm1 - psrlq mm1,32 - - movd eax,mm1 - emms -#else - 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 -#endif - } - } - -/* -* Eight Word Block Multiply/Add -*/ -inline word word8_madd3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd(word* w2, word* w1, word* w0, word a, word b) - { - word carry = *w0; - *w0 = word_madd2(a, b, &carry); - *w1 += carry; - *w2 += (*w1 < carry) ? 1 : 0; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd_2(word* w2, word* w1, word* w0, word a, word b) - { - word carry = 0; - a = word_madd2(a, b, &carry); - b = carry; - - word top = (b >> (BOTAN_MP_WORD_BITS-1)); - b <<= 1; - b |= (a >> (BOTAN_MP_WORD_BITS-1)); - a <<= 1; - - carry = 0; - *w0 = word_add(*w0, a, &carry); - *w1 = word_add(*w1, b, &carry); - *w2 = word_add(*w2, top, &carry); - } - -} - -#endif diff --git a/src/lib/math/mp/mp_x86_64/info.txt b/src/lib/math/mp/mp_x86_64/info.txt deleted file mode 100644 index 75c42ddc1..000000000 --- a/src/lib/math/mp/mp_x86_64/info.txt +++ /dev/null @@ -1,18 +0,0 @@ -load_on dep - -mp_bits 64 - -<header:internal> -mp_madd.h -mp_asmi.h -</header:internal> - -<arch> -x86_64 -</arch> - -<cc> -clang -gcc -icc -</cc> diff --git a/src/lib/math/mp/mp_x86_64/mp_asmi.h b/src/lib/math/mp/mp_x86_64/mp_asmi.h deleted file mode 100644 index cd5884867..000000000 --- a/src/lib/math/mp/mp_x86_64/mp_asmi.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -* 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 <botan/internal/mp_madd.h> - -namespace Botan { - -/* -* Helper Macros for x86-64 Assembly -*/ -#ifndef ASM - #define ASM(x) x "\n\t" -#endif - -#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 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) - -#define ADD_OR_SUBTRACT(CORE_CODE) \ - ASM("rorq %[carry]") \ - CORE_CODE \ - ASM("sbbq %[carry],%[carry]") \ - ASM("negq %[carry]") - -/* -* Word Addition -*/ -inline word word_add(word x, word y, word* carry) - { - asm( - ADD_OR_SUBTRACT(ASM("adcq %[y],%[x]")) - : [x]"=r"(x), [carry]"=r"(*carry) - : "0"(x), [y]"rm"(y), "1"(*carry) - : "cc"); - return x; - } - -/* -* Eight Word Block Addition, Two Argument -*/ -inline word word8_add2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Addition, Three Argument -*/ -inline word word8_add3(word z[8], const word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Word Subtraction -*/ -inline word word_sub(word x, word y, word* carry) - { - asm( - ADD_OR_SUBTRACT(ASM("sbbq %[y],%[x]")) - : [x]"=r"(x), [carry]"=r"(*carry) - : "0"(x), [y]"rm"(y), "1"(*carry) - : "cc"); - return x; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Two Argument -*/ -inline word word8_sub2_rev(word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Subtraction, Three Argument -*/ -inline word word8_sub3(word z[8], const word x[8], const word y[8], word carry) - { - 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; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul2(word x[8], word y, word carry) - { - asm( - DO_8_TIMES(LINMUL_OP, "x") - : [carry]"=r"(carry) - : [x]"r"(x), [y]"rm"(y), "0"(carry) - : "cc", "%rax", "%rdx"); - return carry; - } - -/* -* Eight Word Block Linear Multiplication -*/ -inline word word8_linmul3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Eight Word Block Multiply/Add -*/ -inline word word8_madd3(word z[8], const word x[8], word y, word carry) - { - 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; - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd(word* w2, word* w1, word* w0, word x, word y) - { - 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"); - } - -/* -* Multiply-Add Accumulator -*/ -inline void word3_muladd_2(word* w2, word* w1, word* w0, word x, word y) - { - 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"); - } - -#undef ASM -#undef DO_8_TIMES -#undef ADD_OR_SUBTRACT -#undef ADDSUB2_OP -#undef ADDSUB3_OP -#undef LINMUL_OP -#undef MULADD_OP - -} - -#endif diff --git a/src/lib/math/mp/mp_x86_64/mp_madd.h b/src/lib/math/mp/mp_x86_64/mp_madd.h deleted file mode 100644 index 6f9185dc0..000000000 --- a/src/lib/math/mp/mp_x86_64/mp_madd.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -* Lowest Level MPI Algorithms -* (C) 1999-2008 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 <botan/mp_types.h> - -#if (BOTAN_MP_WORD_BITS != 64) - #error The mp_x86_64 module requires that BOTAN_MP_WORD_BITS == 64 -#endif - -namespace Botan { - -/* -* Helper Macros for x86-64 Assembly -*/ -#define ASM(x) x "\n\t" - -/* -* Word Multiply -*/ -inline word word_madd2(word a, word b, word* c) - { - 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; - } - -/* -* Word Multiply/Add -*/ -inline word word_madd3(word a, word b, word c, word* d) - { - 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; - } - -#undef ASM - -} - -#endif diff --git a/src/lib/math/numbertheory/mp_numth.cpp b/src/lib/math/numbertheory/mp_numth.cpp index 3373b9ee7..d78d21128 100644 --- a/src/lib/math/numbertheory/mp_numth.cpp +++ b/src/lib/math/numbertheory/mp_numth.cpp @@ -1,6 +1,7 @@ /* * Fused and Important MP Algorithms * (C) 1999-2007 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -40,20 +41,13 @@ BigInt mul_add(const BigInt& a, const BigInt& b, const BigInt& c) if(a.sign() != b.sign()) sign = BigInt::Negative; - const size_t a_sw = a.sig_words(); - const size_t b_sw = b.sig_words(); - const size_t c_sw = c.sig_words(); - - BigInt r(sign, std::max(a.size() + b.size(), c_sw) + 1); + BigInt r(sign, std::max(a.size() + b.size(), c.sig_words()) + 1); secure_vector<word> workspace(r.size()); - bigint_mul(r.mutable_data(), r.size(), - workspace.data(), - a.data(), a.size(), a_sw, - b.data(), b.size(), b_sw); + bigint_mul(r, a, b, workspace.data()); - const size_t r_size = std::max(r.sig_words(), c_sw); - bigint_add2(r.mutable_data(), r_size, c.data(), c_sw); + 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; } diff --git a/src/lib/math/numbertheory/powm_mnt.cpp b/src/lib/math/numbertheory/powm_mnt.cpp index 5c441db3a..572f0de98 100644 --- a/src/lib/math/numbertheory/powm_mnt.cpp +++ b/src/lib/math/numbertheory/powm_mnt.cpp @@ -1,6 +1,7 @@ /* * Montgomery Exponentiation * (C) 1999-2010,2012 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,6 +9,7 @@ #include <botan/internal/def_powm.h> #include <botan/numthry.h> #include <botan/internal/mp_core.h> +#include <iostream> namespace Botan { @@ -34,36 +36,26 @@ void Montgomery_Exponentiator::set_base(const BigInt& base) m_g[0] = 1; - bigint_monty_mul(z.mutable_data(), z.size(), - m_g[0].data(), m_g[0].size(), m_g[0].sig_words(), - m_R2_mod.data(), m_R2_mod.size(), m_R2_mod.sig_words(), + 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] = (base >= m_modulus) ? (base % m_modulus) : base; - bigint_monty_mul(z.mutable_data(), z.size(), - m_g[1].data(), m_g[1].size(), m_g[1].sig_words(), - m_R2_mod.data(), m_R2_mod.size(), m_R2_mod.sig_words(), + 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]; - const size_t x_sig = x.sig_words(); for(size_t i = 2; i != m_g.size(); ++i) { const BigInt& y = m_g[i-1]; - const size_t y_sig = y.sig_words(); - bigint_monty_mul(z.mutable_data(), z.size(), - x.data(), x.size(), x_sig, - y.data(), y.size(), y_sig, - m_modulus.data(), m_mod_words, m_mod_prime, + bigint_monty_mul(z, x, y, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); m_g[i] = z; @@ -82,15 +74,13 @@ BigInt Montgomery_Exponentiator::execute() const const size_t z_size = 2*(m_mod_words + 1); BigInt z(BigInt::Positive, z_size); - secure_vector<word> workspace(z_size); + secure_vector<word> workspace(z.size()); for(size_t i = exp_nibbles; i > 0; --i) { for(size_t k = 0; k != m_window_bits; ++k) { - bigint_monty_sqr(z.mutable_data(), z_size, - x.data(), x.size(), x.sig_words(), - m_modulus.data(), m_mod_words, m_mod_prime, + bigint_monty_sqr(z, x, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); x = z; @@ -100,9 +90,7 @@ BigInt Montgomery_Exponentiator::execute() const const BigInt& y = m_g[nibble]; - bigint_monty_mul(z.mutable_data(), z_size, - x.data(), x.size(), x.sig_words(), - y.data(), y.size(), y.sig_words(), + bigint_monty_mul(z, x, y, m_modulus.data(), m_mod_words, m_mod_prime, workspace.data()); diff --git a/src/lib/modes/aead/gcm/gcm.cpp b/src/lib/modes/aead/gcm/gcm.cpp index 1dc5efe4f..e23551cb4 100644 --- a/src/lib/modes/aead/gcm/gcm.cpp +++ b/src/lib/modes/aead/gcm/gcm.cpp @@ -168,7 +168,7 @@ GCM_Mode::GCM_Mode(BlockCipher* cipher, size_t tag_size) : m_ghash.reset(new GHASH); - m_ctr.reset(new CTR_BE(cipher)); // CTR_BE takes ownership of cipher + m_ctr.reset(new CTR_BE(cipher, 4)); // CTR_BE takes ownership of cipher if(m_tag_size != 8 && m_tag_size != 16) throw Invalid_Argument(name() + ": Bad tag size " + std::to_string(m_tag_size)); diff --git a/src/lib/modes/mode_pad/mode_pad.cpp b/src/lib/modes/mode_pad/mode_pad.cpp index 0f1df9e8a..7b4546c86 100644 --- a/src/lib/modes/mode_pad/mode_pad.cpp +++ b/src/lib/modes/mode_pad/mode_pad.cpp @@ -69,8 +69,10 @@ void ANSI_X923_Padding::add_padding(secure_vector<byte>& buffer, { const byte pad_value = static_cast<byte>(block_size - last_byte_pos); - for(size_t i = last_byte_pos; i < block_size; ++i) + for(size_t i = last_byte_pos; i < block_size-1; ++i) + { buffer.push_back(0); + } buffer.push_back(pad_value); } diff --git a/src/lib/modes/mode_pad/mode_pad.h b/src/lib/modes/mode_pad/mode_pad.h index 0a775b1ea..bc2b7c132 100644 --- a/src/lib/modes/mode_pad/mode_pad.h +++ b/src/lib/modes/mode_pad/mode_pad.h @@ -32,6 +32,7 @@ class BOTAN_DLL BlockCipherModePaddingMethod /** * @param block the last block * @param size the of the block + * @return number of padding bytes */ virtual size_t unpad(const byte block[], size_t size) const = 0; @@ -119,7 +120,7 @@ class BOTAN_DLL Null_Padding final : public BlockCipherModePaddingMethod std::string name() const override { return "NoPadding"; } }; -BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec); +BOTAN_DLL BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec); } diff --git a/src/lib/pk_pad/eme_oaep/oaep.cpp b/src/lib/pk_pad/eme_oaep/oaep.cpp index 0ae0d8554..1ae1068a7 100644 --- a/src/lib/pk_pad/eme_oaep/oaep.cpp +++ b/src/lib/pk_pad/eme_oaep/oaep.cpp @@ -35,8 +35,10 @@ secure_vector<byte> OAEP::pad(const byte in[], size_t in_length, { key_length /= 8; - if(key_length < in_length + 2*m_Phash.size() + 1) + if(in_length > maximum_input_size(key_length * 8)) + { throw Invalid_Argument("OAEP: Input is too large"); + } secure_vector<byte> out(key_length); diff --git a/src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp b/src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp index 8148b7bc9..9bab8eb95 100644 --- a/src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp +++ b/src/lib/pk_pad/eme_pkcs1/eme_pkcs.cpp @@ -14,22 +14,22 @@ namespace Botan { * PKCS1 Pad Operation */ secure_vector<byte> EME_PKCS1v15::pad(const byte in[], size_t inlen, - size_t olen, + size_t key_length, RandomNumberGenerator& rng) const { - olen /= 8; + key_length /= 8; - if(olen < 10) - throw Encoding_Error("PKCS1: Output space too small"); - if(inlen > olen - 10) - throw Encoding_Error("PKCS1: Input is too large"); + if(inlen > maximum_input_size(key_length * 8)) + { + throw Invalid_Argument("PKCS1: Input is too large"); + } - secure_vector<byte> out(olen); + secure_vector<byte> out(key_length); out[0] = 0x02; - rng.randomize(out.data() + 1, (olen - inlen - 2)); + rng.randomize(out.data() + 1, (key_length - inlen - 2)); - for(size_t j = 1; j != olen - inlen - 1; ++j) + for(size_t j = 1; j != key_length - inlen - 1; ++j) { if(out[j] == 0) { @@ -37,7 +37,7 @@ secure_vector<byte> EME_PKCS1v15::pad(const byte in[], size_t inlen, } } - buffer_insert(out, olen - inlen, in, inlen); + buffer_insert(out, key_length - inlen, in, inlen); return out; } diff --git a/src/lib/pk_pad/emsa.cpp b/src/lib/pk_pad/emsa.cpp index 3b8641357..4d4b96ad1 100644 --- a/src/lib/pk_pad/emsa.cpp +++ b/src/lib/pk_pad/emsa.cpp @@ -11,10 +11,6 @@ #include <botan/emsa1.h> #endif -#if defined(BOTAN_HAS_EMSA1_BSI) - #include <botan/emsa1_bsi.h> -#endif - #if defined(BOTAN_HAS_EMSA_X931) #include <botan/emsa_x931.h> #endif @@ -45,6 +41,19 @@ EMSA* get_emsa(const std::string& algo_spec) 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 + } + #define BOTAN_REGISTER_EMSA_NAMED_NOARGS(type, name) \ BOTAN_REGISTER_NAMED_T(EMSA, name, type, make_new_T<type>) @@ -58,10 +67,6 @@ EMSA* get_emsa(const std::string& algo_spec) BOTAN_REGISTER_EMSA_1HASH(EMSA1, "EMSA1"); #endif -#if defined(BOTAN_HAS_EMSA1_BSI) -BOTAN_REGISTER_EMSA_1HASH(EMSA1_BSI, "EMSA1_BSI"); -#endif - #if defined(BOTAN_HAS_EMSA_PKCS1) BOTAN_REGISTER_NAMED_T(EMSA, "EMSA_PKCS1", EMSA_PCS1v15, EMSA_PKCS1v15::make); #endif diff --git a/src/lib/pk_pad/emsa.h b/src/lib/pk_pad/emsa.h index d4fd146da..f4697d100 100644 --- a/src/lib/pk_pad/emsa.h +++ b/src/lib/pk_pad/emsa.h @@ -59,16 +59,27 @@ class BOTAN_DLL EMSA size_t key_bits) = 0; virtual ~EMSA(); + + virtual EMSA* clone() = 0; }; /** * Factory method for EMSA (message-encoding methods for signatures * with appendix) objects -* @param algo_spec the name of the EME to create +* @param algo_spec the name of the EMSA to create * @return pointer to newly allocated object of that type */ BOTAN_DLL 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_DLL std::string hash_for_emsa(const std::string& algo_spec); + } #endif diff --git a/src/lib/pk_pad/emsa1/emsa1.cpp b/src/lib/pk_pad/emsa1/emsa1.cpp index 0031bf263..67f8ab21f 100644 --- a/src/lib/pk_pad/emsa1/emsa1.cpp +++ b/src/lib/pk_pad/emsa1/emsa1.cpp @@ -40,6 +40,11 @@ secure_vector<byte> emsa1_encoding(const secure_vector<byte>& msg, } +EMSA* EMSA1::clone() + { + return new EMSA1(m_hash->clone()); + } + void EMSA1::update(const byte input[], size_t length) { m_hash->update(input, length); diff --git a/src/lib/pk_pad/emsa1/emsa1.h b/src/lib/pk_pad/emsa1/emsa1.h index e346167da..5a4b4b372 100644 --- a/src/lib/pk_pad/emsa1/emsa1.h +++ b/src/lib/pk_pad/emsa1/emsa1.h @@ -25,8 +25,13 @@ class BOTAN_DLL EMSA1 : public EMSA */ explicit EMSA1(HashFunction* hash) : m_hash(hash) {} + EMSA* clone() override; + protected: size_t hash_output_length() const { return m_hash->output_length(); } + + std::unique_ptr<HashFunction> m_hash; + private: void update(const byte[], size_t) override; secure_vector<byte> raw_data() override; @@ -39,7 +44,6 @@ class BOTAN_DLL EMSA1 : public EMSA const secure_vector<byte>& raw, size_t key_bits) override; - std::unique_ptr<HashFunction> m_hash; }; } diff --git a/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.cpp b/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.cpp deleted file mode 100644 index 5fc96da8d..000000000 --- a/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.cpp +++ /dev/null @@ -1,29 +0,0 @@ -/* -* EMSA1 BSI -* (C) 1999-2008 Jack Lloyd -* 2008 Falko Strenzke, FlexSecure GmbH -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include <botan/emsa1_bsi.h> - -namespace Botan { - -/* -* EMSA1 BSI Encode Operation -*/ -secure_vector<byte> EMSA1_BSI::encoding_of(const secure_vector<byte>& msg, - size_t output_bits, - RandomNumberGenerator&) - { - if(msg.size() != hash_output_length()) - throw Encoding_Error("EMSA1_BSI::encoding_of: Invalid size for input"); - - if(8*msg.size() <= output_bits) - return msg; - - throw Encoding_Error("EMSA1_BSI::encoding_of: max key input size exceeded"); - } - -} diff --git a/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.h b/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.h deleted file mode 100644 index a7fae6c23..000000000 --- a/src/lib/pk_pad/emsa1_bsi/emsa1_bsi.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -* EMSA1 BSI Variant -* (C) 1999-2008 Jack Lloyd -* 2007 FlexSecure GmbH -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_EMSA1_BSI_H__ -#define BOTAN_EMSA1_BSI_H__ - -#include <botan/emsa1.h> - -namespace Botan { - -/** -* EMSA1_BSI is a variant of EMSA1 specified by the BSI. It accepts -* only hash values which are less or equal than the maximum key -* length. The implementation comes from InSiTo -*/ -class BOTAN_DLL EMSA1_BSI final : public EMSA1 - { - public: - /** - * @param hash the hash object to use - */ - explicit EMSA1_BSI(HashFunction* hash) : EMSA1(hash) {} - private: - secure_vector<byte> encoding_of(const secure_vector<byte>&, size_t, - RandomNumberGenerator& rng) override; - }; - -} - -#endif diff --git a/src/lib/pk_pad/emsa1_bsi/info.txt b/src/lib/pk_pad/emsa1_bsi/info.txt deleted file mode 100644 index 021c99720..000000000 --- a/src/lib/pk_pad/emsa1_bsi/info.txt +++ /dev/null @@ -1,5 +0,0 @@ -define EMSA1_BSI 20131128 - -<requires> -emsa1 -</requires> diff --git a/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.h b/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.h index 9d5bc7829..0773ed2c4 100644 --- a/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.h +++ b/src/lib/pk_pad/emsa_pkcs1/emsa_pkcs1.h @@ -28,6 +28,8 @@ class BOTAN_DLL EMSA_PKCS1v15 final : public EMSA */ explicit EMSA_PKCS1v15(HashFunction* hash); + EMSA* clone() override { return new EMSA_PKCS1v15(m_hash->clone()); } + void update(const byte[], size_t) override; secure_vector<byte> raw_data() override; @@ -50,6 +52,8 @@ class BOTAN_DLL EMSA_PKCS1v15 final : public EMSA class BOTAN_DLL EMSA_PKCS1v15_Raw final : public EMSA { public: + EMSA* clone() override { return new EMSA_PKCS1v15_Raw(); } + void update(const byte[], size_t) override; secure_vector<byte> raw_data() override; diff --git a/src/lib/pk_pad/emsa_pssr/pssr.h b/src/lib/pk_pad/emsa_pssr/pssr.h index ee234b0b6..9b39417a5 100644 --- a/src/lib/pk_pad/emsa_pssr/pssr.h +++ b/src/lib/pk_pad/emsa_pssr/pssr.h @@ -31,6 +31,8 @@ class BOTAN_DLL PSSR final : public EMSA */ PSSR(HashFunction* hash, size_t salt_size); + EMSA* clone() override { return new PSSR(m_hash->clone(), m_SALT_SIZE); } + static PSSR* make(const Spec& spec); private: void update(const byte input[], size_t length) override; diff --git a/src/lib/pk_pad/emsa_raw/emsa_raw.h b/src/lib/pk_pad/emsa_raw/emsa_raw.h index 272d34b0e..cc2d5d63a 100644 --- a/src/lib/pk_pad/emsa_raw/emsa_raw.h +++ b/src/lib/pk_pad/emsa_raw/emsa_raw.h @@ -18,6 +18,9 @@ namespace Botan { */ class BOTAN_DLL EMSA_Raw final : public EMSA { + public: + EMSA* clone() override { return new EMSA_Raw(); } + private: void update(const byte[], size_t) override; secure_vector<byte> raw_data() override; diff --git a/src/lib/pk_pad/emsa_x931/emsa_x931.h b/src/lib/pk_pad/emsa_x931/emsa_x931.h index 400042a86..56754d3b1 100644 --- a/src/lib/pk_pad/emsa_x931/emsa_x931.h +++ b/src/lib/pk_pad/emsa_x931/emsa_x931.h @@ -25,6 +25,8 @@ class BOTAN_DLL EMSA_X931 final : public EMSA * @param hash the hash object to use */ explicit EMSA_X931(HashFunction* hash); + + EMSA* clone() override { return new EMSA_X931(m_hash->clone()); } private: void update(const byte[], size_t) override; secure_vector<byte> raw_data() override; diff --git a/src/lib/pk_pad/hash_id/hash_id.cpp b/src/lib/pk_pad/hash_id/hash_id.cpp index 28bbea346..882c30a4c 100644 --- a/src/lib/pk_pad/hash_id/hash_id.cpp +++ b/src/lib/pk_pad/hash_id/hash_id.cpp @@ -48,6 +48,10 @@ const byte SHA_512_PKCS_ID[] = { 0x30, 0x51, 0x30, 0x0D, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05, 0x00, 0x04, 0x40 }; +const byte 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 byte TIGER_PKCS_ID[] = { 0x30, 0x29, 0x30, 0x0D, 0x06, 0x09, 0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0C, 0x02, 0x05, 0x00, 0x04, 0x18 }; @@ -99,6 +103,10 @@ std::vector<byte> pkcs_hash_id(const std::string& name) return std::vector<byte>(SHA_512_PKCS_ID, SHA_512_PKCS_ID + sizeof(SHA_512_PKCS_ID)); + if(name == "SHA-512-256") + return std::vector<byte>(SHA_512_256_PKCS_ID, + SHA_512_256_PKCS_ID + sizeof(SHA_512_256_PKCS_ID)); + if(name == "Tiger(24,3)") return std::vector<byte>(TIGER_PKCS_ID, TIGER_PKCS_ID + sizeof(TIGER_PKCS_ID)); diff --git a/src/lib/prov/openssl/openssl_rc4.cpp b/src/lib/prov/openssl/openssl_rc4.cpp index e36535e08..d6246e4ab 100644 --- a/src/lib/prov/openssl/openssl_rc4.cpp +++ b/src/lib/prov/openssl/openssl_rc4.cpp @@ -12,6 +12,7 @@ #include <botan/internal/algo_registry.h> #include <botan/internal/openssl.h> #include <botan/parsing.h> +#include <botan/exceptn.h> #include <openssl/rc4.h> namespace Botan { @@ -45,6 +46,16 @@ class OpenSSL_RC4 : public StreamCipher explicit OpenSSL_RC4(size_t skip = 0) : m_skip(skip) { clear(); } ~OpenSSL_RC4() { clear(); } + + void set_iv(const byte*, size_t) override + { + throw Exception("RC4 does not support an IV"); + } + + void seek(u64bit) override + { + throw Exception("RC4 does not support seeking"); + } private: void cipher(const byte in[], byte out[], size_t length) override { diff --git a/src/lib/prov/pkcs11/info.txt b/src/lib/prov/pkcs11/info.txt new file mode 100644 index 000000000..2715c7cda --- /dev/null +++ b/src/lib/prov/pkcs11/info.txt @@ -0,0 +1,48 @@ +define PKCS11 20160219 + +load_on vendor + +<requires> +dyn_load +rng +pk_pad +</requires> + +<header:internal> +p11_mechanism.h +</header:internal> + +<header:external> +pkcs11.h +pkcs11f.h +pkcs11t.h +</header:external> + +<header:public> +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 +</header:public> + +<source> +p11.cpp +p11_ecc_key.cpp +p11_ecdh.cpp +p11_ecdsa.cpp +p11_mechanism.cpp +p11_module.cpp +p11_object.cpp +p11_randomgenerator.cpp +p11_rsa.cpp +p11_session.cpp +p11_slot.cpp +p11_x509.cpp +</source>
\ No newline at end of file diff --git a/src/lib/prov/pkcs11/p11.cpp b/src/lib/prov/pkcs11/p11.cpp new file mode 100644 index 000000000..d338438d3 --- /dev/null +++ b/src/lib/prov/pkcs11/p11.cpp @@ -0,0 +1,769 @@ +/* +* 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 <botan/p11.h> +#include <botan/p11_session.h> + +#include <cstdint> +#include <string> +#include <functional> + +namespace Botan { +namespace PKCS11 { + +ReturnValue* ThrowException = reinterpret_cast< ReturnValue* >(-1); + +namespace { +/// @param function_result Return value of the PKCS11 module function +/// @param returnValue 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"); + } + } + +LowLevel::~LowLevel() BOTAN_NOEXCEPT +{} + +/****************************** 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<get_function_list>("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<SlotId>& 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<MechanismType>& 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); + } + +} + +} diff --git a/src/lib/prov/pkcs11/p11.h b/src/lib/prov/pkcs11/p11.h new file mode 100644 index 000000000..c18c07d59 --- /dev/null +++ b/src/lib/prov/pkcs11/p11.h @@ -0,0 +1,2861 @@ +/* +* 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 <botan/secmem.h> +#include <botan/exceptn.h> +#include <botan/dyn_load.h> + +#include <vector> +#include <string> +#include <map> + +#define BOTAN_PKCS11_RSA_PRIO 90 +#define BOTAN_PKCS11_ECDSA_PRIO 90 +#define BOTAN_PKCS11_ECDH_PRIO 90 + +#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<byte>; + +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_DLL extern ReturnValue* ThrowException; + +const Bbool True = CK_TRUE; +const Bbool False = CK_FALSE; + +inline Flags flags(Flag flags) + { + return static_cast<Flags>(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_DLL 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_DLL 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_DLL 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_DLL void set_pin(Slot& slot, const secure_string& so_pin, const secure_string& pin); + +/// Provides access to all PKCS#11 functions +class BOTAN_DLL LowLevel + { + public: + + /// @param ptr the functon list pointer to use. Can be retrieved via `LowLevel::C_GetFunctionList` + explicit LowLevel(FunctionListPtr ptr); + + ~LowLevel() BOTAN_NOEXCEPT; + + /****************************** 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<SlotId>& 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<MechanismType>& 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<typename TAlloc> + bool C_InitToken(SlotId slot_id, + const std::vector<byte, TAlloc>& 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< byte* >(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<typename TAlloc> + bool C_InitPIN(SessionHandle session, + const std::vector<byte, TAlloc>& pin, + ReturnValue* return_value = ThrowException) const + { + return C_InitPIN(session, reinterpret_cast< Utf8Char* >(const_cast< byte* >(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<typename TAlloc> + bool C_SetPIN(SessionHandle session, + const std::vector<byte, TAlloc>& old_pin, + const std::vector<byte, TAlloc>& new_pin, + ReturnValue* return_value = ThrowException) const + { + return C_SetPIN(session, + reinterpret_cast< Utf8Char* >(const_cast< byte* >(old_pin.data())), old_pin.size(), + reinterpret_cast< Utf8Char* >(const_cast< byte* >(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 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<typename TAlloc> + bool C_Login(SessionHandle session, + UserType user_type, + const std::vector<byte, TAlloc>& pin, + ReturnValue* return_value = ThrowException) const + { + return C_Login(session, user_type, reinterpret_cast< Utf8Char* >(const_cast< byte* >(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<typename TAlloc> + bool C_GetAttributeValue(SessionHandle session, + ObjectHandle object, + std::map<AttributeType, std::vector<byte, TAlloc>>& attribute_values, + ReturnValue* return_value = ThrowException) const + { + std::vector<Attribute> 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< byte* >(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 attributes 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<typename TAlloc> + bool C_SetAttributeValue(SessionHandle session, + ObjectHandle object, + std::map<AttributeType, std::vector<byte, TAlloc>>& attribute_values, + ReturnValue* return_value = ThrowException) const + { + std::vector<Attribute> setter_template; + + for(auto& entry : attribute_values) + { + setter_template.emplace_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(entry.first), entry.second.data(), static_cast<CK_ULONG>(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 gets obj. handles + * @param max_object_count max handles to get + * @param object_count 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 encrypted_data_len_ptr bytes of plaintext + * @param encrypted_data gets ciphertext + * @param encrypted_data_len 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<typename TAllocA, typename TAllocB> + bool C_Encrypt(SessionHandle session, + const std::vector<byte, TAllocA>& plaintext_data, + std::vector<byte, TAllocB>& encrypted_data, + ReturnValue* return_value = ThrowException) const + { + Ulong encrypted_size = 0; + if(!C_Encrypt(session, const_cast<Byte*>((plaintext_data.data())), plaintext_data.size(), nullptr, &encrypted_size, + return_value)) + { + return false; + } + + encrypted_data.resize(encrypted_size); + return C_Encrypt(session, const_cast<Byte*>(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<typename TAllocA, typename TAllocB> + bool C_Decrypt(SessionHandle session, + const std::vector<byte, TAllocA>& encrypted_data, + std::vector<byte, TAllocB>& decrypted_data, + ReturnValue* return_value = ThrowException) const + { + Ulong decrypted_size = 0; + if(!C_Decrypt(session, const_cast<Byte*>((encrypted_data.data())), encrypted_data.size(), nullptr, &decrypted_size, + return_value)) + { + return false; + } + + decrypted_data.resize(decrypted_size); + return C_Decrypt(session, const_cast<Byte*>(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 byte 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<typename TAllocA, typename TAllocB> + bool C_Sign(SessionHandle session, + const std::vector<byte, TAllocA>& data, + std::vector<byte, TAllocB>& signature, + ReturnValue* return_value = ThrowException) const + { + Ulong signature_size = 0; + if(!C_Sign(session, const_cast<Byte*>((data.data())), data.size(), nullptr, &signature_size, return_value)) + { + return false; + } + + signature.resize(signature_size); + return C_Sign(session, const_cast<Byte*>(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<typename TAlloc> + bool C_SignUpdate(SessionHandle session, + const std::vector<byte, TAlloc>& part, + ReturnValue* return_value = ThrowException) const + { + return C_SignUpdate(session, const_cast<Byte*>(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<typename TAlloc> + bool C_SignFinal(SessionHandle session, + std::vector<byte, TAlloc>& 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<typename TAllocA, typename TAllocB> + bool C_Verify(SessionHandle session, + const std::vector<byte, TAllocA>& data, + std::vector<byte, TAllocB>& signature, + ReturnValue* return_value = ThrowException) const + { + return C_Verify(session, const_cast<Byte*>(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<typename TAlloc> + bool C_VerifyUpdate(SessionHandle session, + std::vector<byte, TAlloc> 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 : 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 diff --git a/src/lib/prov/pkcs11/p11_ecc_key.cpp b/src/lib/prov/pkcs11/p11_ecc_key.cpp new file mode 100644 index 000000000..0c3e879d9 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecc_key.cpp @@ -0,0 +1,137 @@ +/* +* 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 <botan/p11_ecc_key.h> + +#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) + +#include <botan/workfactor.h> +#include <botan/ber_dec.h> + +namespace Botan { +namespace PKCS11 { +namespace { +/// Converts a DER-encoded ANSI X9.62 ECPoint to PointGFp +PointGFp decode_public_point(const secure_vector<byte>& ec_point_data, const CurveGFp& curve) + { + secure_vector<byte> ec_point; + BER_Decoder(ec_point_data).decode(ec_point, OCTET_STRING); + return OS2ECP(ec_point, curve); + } +} + +EC_PublicKeyGenerationProperties::EC_PublicKeyGenerationProperties(const std::vector<byte>& ec_params) + : PublicKeyProperties(KeyType::Ec), m_ec_params(ec_params) + { + add_binary(AttributeType::EcParams, m_ec_params); + } + +EC_PublicKeyImportProperties::EC_PublicKeyImportProperties(const std::vector<byte>& ec_params, + const std::vector<byte>& 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<byte> 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; + } + +size_t PKCS11_EC_PublicKey::max_input_bits() const + { + return domain().get_order().bits(); + } + +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<byte> 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<byte>& 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(), m_point_encoding(PublicPointEncoding::Der) + { + secure_vector<byte> 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<byte>& 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 = 0; + m_handle = 0; + 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, &m_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::max_input_bits() const + { + return m_domain_params.get_order().bits(); + } + +std::vector<byte> PKCS11_EC_PrivateKey::x509_subject_public_key() const + { + return unlock(EC2OSP(public_point(), PointGFp::COMPRESSED)); + } + +size_t PKCS11_EC_PrivateKey::estimated_strength() const + { + return ecp_work_factor(domain().get_curve().get_p().bits()); + } + +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 diff --git a/src/lib/prov/pkcs11/p11_ecc_key.h b/src/lib/prov/pkcs11/p11_ecc_key.h new file mode 100644 index 000000000..3d10ae85e --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecc_key.h @@ -0,0 +1,228 @@ +/* +* 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 <botan/build.h> +#include <botan/p11_object.h> + +#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) +#include <botan/pk_keys.h> +#include <botan/ecc_key.h> +#include <botan/ec_group.h> +#include <botan/rng.h> +#include <botan/alg_id.h> +#include <vector> + +namespace Botan { +namespace PKCS11 { + +class Session; + +/// Properties for generating a PKCS#11 EC public key +class BOTAN_DLL EC_PublicKeyGenerationProperties final : public PublicKeyProperties + { + public: + /// @param ec_params DER-encoding of an ANSI X9.62 Parameters value + EC_PublicKeyGenerationProperties(const std::vector<byte>& ec_params); + + /// @return the DER-encoding of the ec parameters according to ANSI X9.62 + inline const std::vector<byte>& ec_params() const + { + return m_ec_params; + } + + private: + const std::vector<byte> m_ec_params; + }; + +/// Properties for importing a PKCS#11 EC public key +class BOTAN_DLL 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<byte>& ec_params, const std::vector<byte>& ec_point); + + /// @return the DER-encoding of the ec parameters according to ANSI X9.62 + inline const std::vector<byte>& 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<byte>& ec_point() const + { + return m_ec_point; + } + + private: + const std::vector<byte> m_ec_params; + const std::vector<byte> m_ec_point; + }; + +/// Represents a PKCS#11 EC public key +class BOTAN_DLL 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); + + size_t max_input_bits() const override; + }; + +/// Properties for generating a PKCS#11 EC private key +class BOTAN_DLL EC_PrivateKeyGenerationProperties final : public PrivateKeyProperties + { + public: + EC_PrivateKeyGenerationProperties() + : PrivateKeyProperties(KeyType::Ec) + {} + }; + +/// Properties for importing a PKCS#11 EC private key +class BOTAN_DLL 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<byte>& ec_params, const BigInt& value); + + /// @return the DER-encoding of the ec parameters according to ANSI X9.62 + inline const std::vector<byte>& 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<byte> 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_DLL 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<byte>& 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::size_t max_input_bits() const override; + + std::vector<byte> x509_subject_public_key() 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; + }; +} + +} + +#endif + +#endif diff --git a/src/lib/prov/pkcs11/p11_ecdh.cpp b/src/lib/prov/pkcs11/p11_ecdh.cpp new file mode 100644 index 000000000..de24d6da4 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecdh.cpp @@ -0,0 +1,141 @@ +/* +* 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 <botan/p11_ecdh.h> + +#if defined(BOTAN_HAS_ECDH) + +#include <botan/internal/p11_mechanism.h> +#include <botan/ber_dec.h> +#include <botan/der_enc.h> +#include <botan/internal/algo_registry.h> +#include <botan/internal/pk_utils.h> +#include <botan/rng.h> + +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<byte> PKCS11_ECDH_PrivateKey::pkcs8_private_key() const + { + return export_key().pkcs8_private_key(); + } + +namespace { +class PKCS11_ECDH_KA_Operation : public PK_Ops::Key_Agreement + { + public: + typedef PKCS11_EC_PrivateKey Key_Type; + + static PKCS11_ECDH_KA_Operation* make_ecdh(const Spec& spec, bool use_cofactor) + { + try + { + if(auto* key = dynamic_cast< const PKCS11_EC_PrivateKey* >(&spec.key())) + { + return new PKCS11_ECDH_KA_Operation(*key, spec.padding(), use_cofactor); + } + } + catch(...) + { + } + + return nullptr; + } + + PKCS11_ECDH_KA_Operation(const PKCS11_EC_PrivateKey& key, const std::string& kdf, bool use_cofactor) + : PK_Ops::Key_Agreement(), m_key(key), m_mechanism(MechanismWrapper::create_ecdh_mechanism(kdf, use_cofactor)) + {} + + + /// 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<byte> agree(size_t key_len, const byte other_key[], size_t other_key_len, const byte salt[], + size_t salt_len) override + { + std::vector<byte> 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<byte> 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; + }; + +Algo_Registry<PK_Ops::Key_Agreement>::Add g_PKCS11_ECDH_KA_Operation_reg("ECDH", + std::bind(&PKCS11_ECDH_KA_Operation::make_ecdh, std::placeholders::_1, false), "pkcs11", BOTAN_PKCS11_ECDH_PRIO); + +Algo_Registry<PK_Ops::Key_Agreement>::Add g_PKCS11_ECDHC_KA_Operation_reg("ECDHC", + std::bind(&PKCS11_ECDH_KA_Operation::make_ecdh, std::placeholders::_1, true), "pkcs11", BOTAN_PKCS11_ECDH_PRIO); + +} + +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 diff --git a/src/lib/prov/pkcs11/p11_ecdh.h b/src/lib/prov/pkcs11/p11_ecdh.h new file mode 100644 index 000000000..749a00d52 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecdh.h @@ -0,0 +1,122 @@ +/* +* 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 <botan/build.h> +#if defined(BOTAN_HAS_ECDH) + +#include <botan/p11.h> +#include <botan/p11_ecc_key.h> +#include <botan/ecdh.h> + +#include <string> +#include <vector> + +namespace Botan { +namespace PKCS11 { +class Session; + +/// Represents a PKCS#11 ECDH public key +class BOTAN_DLL PKCS11_ECDH_PublicKey final : 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_DLL 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<byte>& 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<byte> public_value() const override + { + return unlock(EC2OSP(public_point(), PointGFp::UNCOMPRESSED)); + } + + /// @return the exported ECDH private key + ECDH_PrivateKey export_key() const; + + secure_vector<byte> pkcs8_private_key() const override; + }; + +using PKCS11_ECDH_KeyPair = std::pair<PKCS11_ECDH_PublicKey, PKCS11_ECDH_PrivateKey>; + +/** +* 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_DLL PKCS11_ECDH_KeyPair generate_ecdh_keypair(Session& session, const EC_PublicKeyGenerationProperties& pub_props, + const EC_PrivateKeyGenerationProperties& priv_props); +} + +} + +#endif +#endif diff --git a/src/lib/prov/pkcs11/p11_ecdsa.cpp b/src/lib/prov/pkcs11/p11_ecdsa.cpp new file mode 100644 index 000000000..078bc429d --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecdsa.cpp @@ -0,0 +1,229 @@ +/* +* 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 <botan/p11_ecdsa.h> + +#if defined(BOTAN_HAS_ECDSA) + +#include <botan/internal/p11_mechanism.h> +#include <botan/internal/algo_registry.h> +#include <botan/internal/pk_utils.h> +#include <botan/keypair.h> +#include <botan/rng.h> + +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; + } + + return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); + } + +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<byte> PKCS11_ECDSA_PrivateKey::pkcs8_private_key() const + { + return export_key().pkcs8_private_key(); + } + +namespace { + +class PKCS11_ECDSA_Signature_Operation : public PK_Ops::Signature + { + public: + typedef PKCS11_EC_PrivateKey Key_Type; + + 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)) + {} + + size_t message_parts() const override + { + return 2; + } + + size_t message_part_size() const override + { + return m_order.bytes(); + } + + void update(const byte 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<byte>(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<byte> sign(RandomNumberGenerator&) override + { + secure_vector<byte> 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<byte> m_first_message; + bool m_initialized = false; + }; + + +class PKCS11_ECDSA_Verification_Operation : public PK_Ops::Verification + { + public: + typedef PKCS11_EC_PublicKey Key_Type; + + 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)) + {} + + size_t message_parts() const override + { + return 2; + } + + size_t message_part_size() const override + { + return m_order.bytes(); + } + + size_t max_input_bits() const override + { + return m_order.bits(); + } + + void update(const byte 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<byte>(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 byte 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_EC_PublicKey& m_key; + const BigInt& m_order; + MechanismWrapper m_mechanism; + secure_vector<byte> m_first_message; + bool m_initialized = false; + }; + +BOTAN_REGISTER_TYPE(PK_Ops::Signature, PKCS11_ECDSA_Signature_Operation, "ECDSA", + (make_pk_op<PK_Ops::Signature, PKCS11_ECDSA_Signature_Operation>), "pkcs11", BOTAN_PKCS11_ECDSA_PRIO); + +BOTAN_REGISTER_TYPE(PK_Ops::Verification, PKCS11_ECDSA_Verification_Operation, "ECDSA", + (make_pk_op<PK_Ops::Verification, PKCS11_ECDSA_Verification_Operation>), "pkcs11", BOTAN_PKCS11_ECDSA_PRIO); + +} + +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<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_ECDSA_PublicKey(session, pub_key_handle), PKCS11_ECDSA_PrivateKey(session, + priv_key_handle)); + } + +} + +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_ecdsa.h b/src/lib/prov/pkcs11/p11_ecdsa.h new file mode 100644 index 000000000..d3d07a780 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_ecdsa.h @@ -0,0 +1,127 @@ +/* +* 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 <botan/build.h> +#if defined(BOTAN_HAS_ECDSA) + +#include <botan/p11_ecc_key.h> +#include <botan/ecdsa.h> + +#include <string> + +namespace Botan { +namespace PKCS11 { +class Session; + +/// Represents a PKCS#11 ECDSA public key +class BOTAN_DLL 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"; + } + + inline std::size_t max_input_bits() const override + { + return domain().get_order().bits(); + } + + /// @return the exported ECDSA public key + ECDSA_PublicKey export_key() const; + }; + +/// Represents a PKCS#11 ECDSA private key +class BOTAN_DLL 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<byte>& ec_params, + const EC_PrivateKeyGenerationProperties& props) + : PKCS11_EC_PrivateKey(session, ec_params, props) + {} + + inline std::string algo_name() const override + { + return "ECDSA"; + } + + inline size_t message_parts() const override + { + return 2; + } + + /// @return the exported ECDSA private key + ECDSA_PrivateKey export_key() const; + + secure_vector<byte> pkcs8_private_key() const override; + + bool check_key(RandomNumberGenerator&, bool) const override; + }; + +using PKCS11_ECDSA_KeyPair = std::pair<PKCS11_ECDSA_PublicKey, PKCS11_ECDSA_PrivateKey>; + +/** +* 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_DLL PKCS11_ECDSA_KeyPair generate_ecdsa_keypair(Session& session, + const EC_PublicKeyGenerationProperties& pub_props, const EC_PrivateKeyGenerationProperties& priv_props); +} + +} + +#endif +#endif diff --git a/src/lib/prov/pkcs11/p11_mechanism.cpp b/src/lib/prov/pkcs11/p11_mechanism.cpp new file mode 100644 index 000000000..07ac00770 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_mechanism.cpp @@ -0,0 +1,250 @@ +/* +* 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 <botan/internal/p11_mechanism.h> +#include <botan/scan_name.h> +#include <botan/emsa.h> + +#include <tuple> + +namespace Botan { +namespace PKCS11 { + +namespace { +using PSS_Params = std::tuple<size_t, MechanismType, MGF>; + +// 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<MechanismType, PSS_Params> 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) + {} + + virtual ~MechanismData() = default; + + // the mechanism to perform + MechanismType type; + }; + +struct RSA_SignMechanism : public MechanismData + { + explicit RSA_SignMechanism(MechanismType _type) + : MechanismData(_type), hash(static_cast<MechanismType>(0)), mgf(static_cast<MGF>(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<std::string, RSA_SignMechanism> 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 : 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<MechanismType>(0), static_cast<MGF>(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<std::string, RSA_CryptMechanism> 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<std::string, MechanismType> 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<std::string, KeyDerivation> 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<CK_MECHANISM_TYPE>(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<MechanismParameters>(); + mech.m_parameters->oaep_params.hashAlg = static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash); + mech.m_parameters->oaep_params.mgf = static_cast<CK_RSA_PKCS_MGF_TYPE>(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<MechanismParameters>(); + mech.m_parameters->pss_params.hashAlg = static_cast<CK_MECHANISM_TYPE>(mechanism_info.hash); + mech.m_parameters->pss_params.mgf = static_cast<CK_RSA_PKCS_MGF_TYPE>(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& kdf_name, bool use_cofactor) + { + 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<MechanismParameters>(); + mech.m_parameters->ecdh_params.kdf = static_cast<CK_EC_KDF_TYPE>(kdf->second); + mech.m_mechanism.pParameter = mech.m_parameters.get(); + mech.m_mechanism.ulParameterLen = sizeof(Ecdh1DeriveParams); + return mech; + } + +} +} diff --git a/src/lib/prov/pkcs11/p11_mechanism.h b/src/lib/prov/pkcs11/p11_mechanism.h new file mode 100644 index 000000000..5d8c826ee --- /dev/null +++ b/src/lib/prov/pkcs11/p11_mechanism.h @@ -0,0 +1,108 @@ +/* +* 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 <botan/p11.h> + +#include <utility> +#include <string> +#include <memory> + +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 kdf_name the key derivation function to use. Supported KDFs are Raw and SHA-160 to SHA-512 + * @param use_cofactor true if the cofactor key derivation mechanism should be used + */ + static MechanismWrapper create_ecdh_mechanism(const std::string& kdf_name, bool use_cofactor); + + /// Sets the salt for the ECDH mechanism parameters + inline void set_ecdh_salt(const byte salt[], size_t salt_len) + { + m_parameters->ecdh_params.pSharedData = const_cast<byte*>(salt); + m_parameters->ecdh_params.ulSharedDataLen = salt_len; + } + + /// Sets the public key of the other party for the ECDH mechanism parameters + inline void set_ecdh_other_key(const byte other_key[], size_t other_key_len) + { + m_parameters->ecdh_params.pPublicData = const_cast<byte*>(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<Mechanism*>(&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<MechanismParameters> m_parameters; + size_t m_padding_size = 0; + }; + +} + +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_module.cpp b/src/lib/prov/pkcs11/p11_module.cpp new file mode 100644 index 000000000..4ea3dc56d --- /dev/null +++ b/src/lib/prov/pkcs11/p11_module.cpp @@ -0,0 +1,41 @@ +/* +* 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 <botan/p11_module.h> + +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 + { + m_low_level->C_Finalize(nullptr, nullptr); + } + +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); + } + +} +} diff --git a/src/lib/prov/pkcs11/p11_module.h b/src/lib/prov/pkcs11/p11_module.h new file mode 100644 index 000000000..990458a4d --- /dev/null +++ b/src/lib/prov/pkcs11/p11_module.h @@ -0,0 +1,79 @@ +/* +* 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 <string> +#include <memory> + +#include <botan/p11.h> +#include <botan/dyn_load.h> + +namespace Botan { +namespace PKCS11 { + +/** +* Loads the PKCS#11 shared library +* Calls C_Initialize on load and C_Finalize on destruction +*/ +class BOTAN_DLL 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<Dynamically_Loaded_Library> m_library = nullptr; + std::unique_ptr<LowLevel> m_low_level = nullptr; + }; + +} +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_object.cpp b/src/lib/prov/pkcs11/p11_object.cpp new file mode 100644 index 000000000..ef7477284 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_object.cpp @@ -0,0 +1,217 @@ +/* +* 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 <botan/p11_object.h> + +#include <map> + +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< byte* >(&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 byte* >(m_strings.back().data()), value.size()); + } + +void AttributeContainer::add_binary(AttributeType attribute, const byte* value, size_t length) + { + m_vectors.push_back(secure_vector<byte>(value, value + length)); + add_attribute(attribute, reinterpret_cast< const byte* >(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< byte* >(&m_numerics.back()), sizeof(Bbool)); + } + +void AttributeContainer::add_attribute(AttributeType attribute, const byte* 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<byte>& data) + { + return data.data() == existing_attribute.pValue; + }), m_vectors.end()); + + existing_attribute.pValue = const_cast< byte* >(value); + existing_attribute.ulValueLen = size; + exists = true; + break; + } + } + + if(!exists) + { + m_attributes.push_back(Attribute{ static_cast< CK_ATTRIBUTE_TYPE >(attribute), const_cast< byte* >(value), size }); + } + } + +// ==================================================================================================== + +ObjectFinder::ObjectFinder(Session& session, const std::vector<Attribute>& 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 + { + if(m_search_terminated == false) + { + module()->C_FindObjectsFinal(m_session.get().handle(), nullptr); + } + } + +std::vector<ObjectHandle> ObjectFinder::find(uint32_t max_count) const + { + std::vector<ObjectHandle> 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<byte> Object::get_attribute_value(AttributeType attribute) const + { + std::map<AttributeType, secure_vector<byte>> attribute_map = { { attribute, secure_vector<byte>() } }; + 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<byte>& value) const + { + std::map<AttributeType, secure_vector<byte>> 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; + } +} +} diff --git a/src/lib/prov/pkcs11/p11_object.h b/src/lib/prov/pkcs11/p11_object.h new file mode 100644 index 000000000..4a6a54b20 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_object.h @@ -0,0 +1,743 @@ +/* +* 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 <botan/p11.h> +#include <botan/p11_session.h> +#include <botan/secmem.h> + +#include <vector> +#include <string> +#include <type_traits> +#include <list> +#include <functional> + +namespace Botan { +namespace PKCS11 { + +class Module; + +/// Helper class to build the Attribute / CK_ATTRIBUTE structures +class BOTAN_DLL 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<Attribute>& attributes() const + { + return m_attributes; + } + + 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) + void add_class(ObjectClass object_class); + + /// Add a string attribute (e.g. CKA_LABEL / AttributeType::Label) + void add_string(AttributeType attribute, const std::string& value); + + /// Add a binary attribute (e.g. CKA_ID / AttributeType::Id) + void add_binary(AttributeType attribute, const byte* value, size_t length); + + /// Add a binary attribute (e.g. CKA_ID / AttributeType::Id) + template<typename TAlloc> + void add_binary(AttributeType attribute, const std::vector<byte, TAlloc>& binary) + { + add_binary(attribute, binary.data(), binary.size()); + } + + /// Add a bool attribute (e.g. CKA_SENSITIVE / AttributeType::Sensitive) + void add_bool(AttributeType attribute, bool value); + + /// Add a numeric attribute (e.g. CKA_MODULUS_BITS / AttributeType::ModulusBits) + template<typename T> + void add_numeric(AttributeType attribute, T value) + { + static_assert(std::is_integral<T>::value, "Numeric value required."); + m_numerics.push_back(static_cast< uint64_t >(value)); + add_attribute(attribute, reinterpret_cast< byte* >(&m_numerics.back()), sizeof(T)); + } + + protected: + /// Add a attribute with the given value and size to the attribute collection `m_attributes` + void add_attribute(AttributeType attribute, const byte* value, uint32_t size); + + private: + std::vector<Attribute> m_attributes; + std::list<uint64_t> m_numerics; + std::list<std::string> m_strings; + std::list<secure_vector<byte>> m_vectors; + }; + +/// Manages calls to C_FindObjects* functions (C_FindObjectsInit -> C_FindObjects -> C_FindObjectsFinal) +class BOTAN_DLL 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<Attribute>& 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<ObjectHandle> 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<Session> m_session; + bool m_search_terminated; + }; + +/// Common attributes of all objects +class BOTAN_DLL 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_DLL 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_DLL DataObjectProperties : 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<byte>& object_id) + { + add_binary(AttributeType::ObjectId, object_id); + } + + /// @param value value of the object + inline void set_value(const secure_vector<byte>& value) + { + add_binary(AttributeType::Value, value); + } + }; + +/// Common attributes of all certificate objects +class BOTAN_DLL 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<byte>& 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<byte*>(&date), sizeof(Date)); + } + + /// @param date end date for the certificate + inline void set_end_date(Date date) + { + add_binary(AttributeType::EndDate, reinterpret_cast<byte*>(&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<byte>& 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_DLL 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<byte>& 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<byte*>(&date), sizeof(Date)); + } + + /// @param date end date for the key + inline void set_end_date(Date date) + { + add_binary(AttributeType::EndDate, reinterpret_cast<byte*>(&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<MechanismType>&) + { + 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_DLL 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<byte>& 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<byte>& pubkey_info) + { + add_binary(AttributeType::PublicKeyInfo, pubkey_info); + } + }; + +/// Common attributes of all private keys +class BOTAN_DLL 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<byte>& 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<byte>& pubkey_info) + { + add_binary(AttributeType::PublicKeyInfo, pubkey_info); + } + }; + +/// Common attributes of all secret (symmetric) keys +class BOTAN_DLL SecretKeyProperties : 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<byte>& 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_DLL DomainParameterProperties : 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; + }; + +class BOTAN_DLL 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); + + virtual ~Object() = default; + + /// Searches for all objects of the given type that match `search_template` + template<typename T> + static std::vector<T> search(Session& session, const std::vector<Attribute>& search_template); + + /// Searches for all objects of the given type using the label (`CKA_LABEL`) + template<typename T> + static std::vector<T> search(Session& session, const std::string& label); + + /// Searches for all objects of the given type using the id (`CKA_ID`) + template<typename T> + static std::vector<T> search(Session& session, const std::vector<byte>& id); + + /// Searches for all objects of the given type using the label (`CKA_LABEL`) and id (`CKA_ID`) + template<typename T> + static std::vector<T> search(Session& session, const std::string& label, const std::vector<byte>& id); + + /// Searches for all objects of the given type + template<typename T> + static std::vector<T> search(Session& session); + + /// @returns the value of the given attribute (using `C_GetAttributeValue`) + secure_vector<byte> 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<byte>& 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) + {} + + const std::reference_wrapper<Session> m_session; + ObjectHandle m_handle; + }; + +template<typename T> +std::vector<T> Object::search(Session& session, const std::vector<Attribute>& search_template) + { + ObjectFinder finder(session, search_template); + std::vector<ObjectHandle> handles = finder.find(); + std::vector<T> result; + result.reserve(handles.size()); + for(const auto& handle : handles) + { + result.emplace_back(T(session, handle)); + } + return result; + } + +template<typename T> +std::vector<T> Object::search(Session& session, const std::string& label) + { + AttributeContainer search_template(T::Class); + search_template.add_string(AttributeType::Label, label); + return search<T>(session, search_template.attributes()); + } + +template<typename T> +std::vector<T> Object::search(Session& session, const std::vector<byte>& id) + { + AttributeContainer search_template(T::Class); + search_template.add_binary(AttributeType::Id, id); + return search<T>(session, search_template.attributes()); + } + +template<typename T> +std::vector<T> Object::search(Session& session, const std::string& label, const std::vector<byte>& id) + { + AttributeContainer search_template(T::Class); + search_template.add_string(AttributeType::Label, label); + search_template.add_binary(AttributeType::Id, id); + return search<T>(session, search_template.attributes()); + } + +template<typename T> +std::vector<T> Object::search(Session& session) + { + return search<T>(session, AttributeContainer(T::Class).attributes()); + } + +} + +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_randomgenerator.cpp b/src/lib/prov/pkcs11/p11_randomgenerator.cpp new file mode 100644 index 000000000..eaf9933c6 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_randomgenerator.cpp @@ -0,0 +1,31 @@ +/* +* 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 <botan/p11_randomgenerator.h> + +namespace Botan { + +namespace PKCS11 { + +PKCS11_RNG::PKCS11_RNG(Session& session) + : m_session(session) + {} + +void PKCS11_RNG::randomize(Botan::byte output[], std::size_t length) + { + module()->C_GenerateRandom(m_session.get().handle(), output, length); + } + +void PKCS11_RNG::add_entropy(const Botan::byte in[], std::size_t length) + { + module()->C_SeedRandom(m_session.get().handle(), const_cast<Botan::byte*>(in), length); + } + +} +} + diff --git a/src/lib/prov/pkcs11/p11_randomgenerator.h b/src/lib/prov/pkcs11/p11_randomgenerator.h new file mode 100644 index 000000000..a291c89f3 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_randomgenerator.h @@ -0,0 +1,70 @@ +/* +* 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 <botan/rng.h> +#include <botan/p11_session.h> +#include <botan/entropy_src.h> + +#include <string> +#include <functional> + +namespace Botan { +namespace PKCS11 { + +class Module; + +/// A random generator that only fetches random from the PKCS#11 RNG +class BOTAN_DLL 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); + + void clear() override + {} + + 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(Botan::byte 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 Botan::byte in[], std::size_t length) override; + + private: + const std::reference_wrapper<Session> m_session; + }; +} + +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_rsa.cpp b/src/lib/prov/pkcs11/p11_rsa.cpp new file mode 100644 index 000000000..9e5675301 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_rsa.cpp @@ -0,0 +1,377 @@ +/* +* 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 <botan/p11_rsa.h> + +#if defined(BOTAN_HAS_RSA) + +#include <botan/internal/p11_mechanism.h> +#include <botan/pk_ops.h> +#include <botan/internal/algo_registry.h> +#include <botan/internal/pk_utils.h> +#include <botan/rng.h> +#include <botan/blinding.h> + +#if defined(BOTAN_HAS_SYSTEM_RNG) + #include <botan/system_rng.h> +#else + #include <botan/auto_rng.h> +#endif + +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 = 0; + m_handle = 0; + 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, &m_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); + +#if defined(BOTAN_HAS_SYSTEM_RNG) + System_RNG rng; +#else + AutoSeeded_RNG rng; +#endif + + return RSA_PrivateKey(rng + , BigInt::decode(p) + , BigInt::decode(q) + , BigInt::decode(e) + , BigInt::decode(d) + , BigInt::decode(n)); + } + +secure_vector<byte> PKCS11_RSA_PrivateKey::pkcs8_private_key() const + { + return export_key().pkcs8_private_key(); + } + + +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 : public PK_Ops::Decryption + { + public: + typedef PKCS11_RSA_PrivateKey Key_Type; + + PKCS11_RSA_Decryption_Operation(const PKCS11_RSA_PrivateKey& key, const std::string& padding) + : 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(), + [ 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; + } + + size_t max_input_bits() const override + { + return m_bits; + } + + secure_vector<byte> decrypt(byte& valid_mask, const byte 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<byte> 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<byte> 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 : public PK_Ops::Encryption + { + public: + typedef PKCS11_RSA_PublicKey Key_Type; + + 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<byte> encrypt(const byte msg[], size_t msg_len, RandomNumberGenerator&) override + { + m_key.module()->C_EncryptInit(m_key.session().handle(), m_mechanism.data(), m_key.handle()); + + secure_vector<byte> encrytped_data; + m_key.module()->C_Encrypt(m_key.session().handle(), secure_vector<byte>(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 : public PK_Ops::Signature + { + public: + typedef PKCS11_RSA_PrivateKey Key_Type; + + PKCS11_RSA_Signature_Operation(const PKCS11_RSA_PrivateKey& key, const std::string& padding) + : m_key(key), m_mechanism(MechanismWrapper::create_rsa_sign_mechanism(padding)) + {} + + size_t message_part_size() const override + { + return m_key.get_n().bytes(); + } + + void update(const byte 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<byte>(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<byte> sign(RandomNumberGenerator&) override + { + secure_vector<byte> 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<byte> m_first_message; + MechanismWrapper m_mechanism; + }; + + +class PKCS11_RSA_Verification_Operation : public PK_Ops::Verification + { + public: + typedef PKCS11_RSA_PublicKey Key_Type; + + PKCS11_RSA_Verification_Operation(const PKCS11_RSA_PublicKey& key, const std::string& padding) + : m_key(key), m_mechanism(MechanismWrapper::create_rsa_sign_mechanism(padding)) + {} + + size_t message_part_size() const override + { + return m_key.get_n().bytes(); + } + + size_t max_input_bits() const override + { + return m_key.get_n().bits() - 1; + } + + void update(const byte 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<byte>(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 byte 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<byte> m_first_message; + MechanismWrapper m_mechanism; + }; + +BOTAN_REGISTER_TYPE(PK_Ops::Decryption, PKCS11_RSA_Decryption_Operation, "RSA", + (make_pk_op<PK_Ops::Decryption, PKCS11_RSA_Decryption_Operation>), "pkcs11", BOTAN_PKCS11_RSA_PRIO); + +BOTAN_REGISTER_TYPE(PK_Ops::Encryption, PKCS11_RSA_Encryption_Operation, "RSA", + (make_pk_op<PK_Ops::Encryption, PKCS11_RSA_Encryption_Operation>), "pkcs11", BOTAN_PKCS11_RSA_PRIO); + +BOTAN_REGISTER_TYPE(PK_Ops::Signature, PKCS11_RSA_Signature_Operation, "RSA", + (make_pk_op<PK_Ops::Signature, PKCS11_RSA_Signature_Operation>), "pkcs11", BOTAN_PKCS11_RSA_PRIO); + +BOTAN_REGISTER_TYPE(PK_Ops::Verification, PKCS11_RSA_Verification_Operation, "RSA", + (make_pk_op<PK_Ops::Verification, PKCS11_RSA_Verification_Operation>), "pkcs11", BOTAN_PKCS11_RSA_PRIO); + +} + +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 diff --git a/src/lib/prov/pkcs11/p11_rsa.h b/src/lib/prov/pkcs11/p11_rsa.h new file mode 100644 index 000000000..2739cf3e5 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_rsa.h @@ -0,0 +1,212 @@ +/* +* 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 <botan/build.h> +#include <botan/p11.h> +#include <botan/p11_session.h> +#include <botan/p11_object.h> + +#if defined(BOTAN_HAS_RSA) +#include <botan/rsa.h> +#include <utility> + +namespace Botan { +namespace PKCS11 { + +/// Properties for generating a PKCS#11 RSA public key +class BOTAN_DLL 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_DLL 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_DLL PKCS11_RSA_PublicKey final : 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); + }; + +/// Properties for importing a PKCS#11 RSA private key +class BOTAN_DLL 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_DLL RSA_PrivateKeyGenerationProperties final : public PrivateKeyProperties + { + public: + RSA_PrivateKeyGenerationProperties() + : PrivateKeyProperties(KeyType::Rsa) + {} + + virtual ~RSA_PrivateKeyGenerationProperties() = default; + }; + +/// Represents a PKCS#11 RSA private key +class BOTAN_DLL 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 + * @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<byte> pkcs8_private_key() const override; + }; + +using PKCS11_RSA_KeyPair = std::pair<PKCS11_RSA_PublicKey, PKCS11_RSA_PrivateKey>; + +/** +* 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_DLL PKCS11_RSA_KeyPair generate_rsa_keypair(Session& session, const RSA_PublicKeyGenerationProperties& pub_props, + const RSA_PrivateKeyGenerationProperties& priv_props); +} + +} +#endif + +#endif diff --git a/src/lib/prov/pkcs11/p11_session.cpp b/src/lib/prov/pkcs11/p11_session.cpp new file mode 100644 index 000000000..ceb316169 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_session.cpp @@ -0,0 +1,89 @@ +/* +* 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 <botan/p11_session.h> + +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<CK_STATE>(SessionState::RoPublicSession) + || info.state == static_cast<CK_STATE>(SessionState::RwPublicSession)) + { + m_logged_in = false; + } + else + { + m_logged_in = true; + } + } + +Session::~Session() BOTAN_NOEXCEPT + { + if(m_handle) + { + if(m_logged_in) + { + module()->C_Logout(m_handle, nullptr); + } + module()->C_CloseSession(m_handle, nullptr); + m_handle = 0; + } + } + +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); + } + +} +} diff --git a/src/lib/prov/pkcs11/p11_session.h b/src/lib/prov/pkcs11/p11_session.h new file mode 100644 index 000000000..49f223a90 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_session.h @@ -0,0 +1,105 @@ +/* +* 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 <botan/p11.h> +#include <botan/p11_slot.h> + +#include <utility> + +namespace Botan { +namespace PKCS11 { +class Module; + +/// Represents a PKCS#11 session +class BOTAN_DLL 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 diff --git a/src/lib/prov/pkcs11/p11_slot.cpp b/src/lib/prov/pkcs11/p11_slot.cpp new file mode 100644 index 000000000..95a0fad50 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_slot.cpp @@ -0,0 +1,60 @@ +/* +* 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 <botan/p11_slot.h> + +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<MechanismType> Slot::get_mechanism_list() const + { + std::vector<MechanismType> 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<SlotId> Slot::get_available_slots(Module& module, bool token_present) + { + std::vector<SlotId> 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); + } +} + +} diff --git a/src/lib/prov/pkcs11/p11_slot.h b/src/lib/prov/pkcs11/p11_slot.h new file mode 100644 index 000000000..92e585ba1 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_slot.h @@ -0,0 +1,79 @@ +/* +* 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 <string> +#include <vector> +#include <functional> + +#include <botan/p11.h> +#include <botan/p11_module.h> + +namespace Botan { +namespace PKCS11 { + +/// Represents a PKCS#11 Slot, i.e., a card reader +class BOTAN_DLL 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<SlotId> 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<MechanismType> 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<Module> m_module; + const SlotId m_slot_id; + }; + +} +} + +#endif diff --git a/src/lib/prov/pkcs11/p11_x509.cpp b/src/lib/prov/pkcs11/p11_x509.cpp new file mode 100644 index 000000000..76b120368 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_x509.cpp @@ -0,0 +1,37 @@ +/* +* 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 <botan/p11_x509.h> + +#if defined(BOTAN_HAS_X509_CERTIFICATES) + +namespace Botan { +namespace PKCS11 { + +X509_CertificateProperties::X509_CertificateProperties(const std::vector<byte>& subject, const std::vector<byte>& 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 diff --git a/src/lib/prov/pkcs11/p11_x509.h b/src/lib/prov/pkcs11/p11_x509.h new file mode 100644 index 000000000..f0e025ff4 --- /dev/null +++ b/src/lib/prov/pkcs11/p11_x509.h @@ -0,0 +1,115 @@ +/* +* 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 <botan/build.h> +#if defined(BOTAN_HAS_X509_CERTIFICATES) + +#include <botan/p11_object.h> + +#include <botan/x509cert.h> + +#include <vector> + +namespace Botan { +namespace PKCS11 { + +class Session; + +/// Common attributes of all PKCS#11 X509 certificates +class BOTAN_DLL 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<byte>& subject, const std::vector<byte>& value); + + /// @param id key identifier for public/private key pair + inline void set_id(const std::vector<byte>& id) + { + add_binary(AttributeType::Id, id); + } + + /// @param issuer DER-encoding of the certificate issuer name + inline void set_issuer(const std::vector<byte>& issuer) + { + add_binary(AttributeType::Issuer, issuer); + } + + /// @param serial DER-encoding of the certificate serial number + inline void set_serial(const std::vector<byte>& serial) + { + add_binary(AttributeType::SerialNumber, serial); + } + + /// @param hash hash value of the subject public key + inline void set_subject_pubkey_hash(const std::vector<byte>& hash) + { + add_binary(AttributeType::HashOfSubjectPublicKey, hash); + } + + /// @param hash hash value of the issuer public key + inline void set_issuer_pubkey_hash(const std::vector<byte>& 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<Ulong>(alg)); + } + + /// @return the subject + inline const std::vector<byte>& subject() const + { + return m_subject; + } + + /// @return the BER-encoding of the certificate + inline const std::vector<byte>& value() const + { + return m_value; + } + + private: + const std::vector<byte> m_subject; + const std::vector<byte> m_value; + }; + +/// Represents a PKCS#11 X509 certificate +class BOTAN_DLL 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 diff --git a/src/lib/prov/pkcs11/pkcs11.h b/src/lib/prov/pkcs11/pkcs11.h new file mode 100644 index 000000000..c66b0bca9 --- /dev/null +++ b/src/lib/prov/pkcs11/pkcs11.h @@ -0,0 +1,264 @@ +/* + * 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_ */ + diff --git a/src/lib/prov/pkcs11/pkcs11f.h b/src/lib/prov/pkcs11/pkcs11f.h new file mode 100644 index 000000000..48ba5726f --- /dev/null +++ b/src/lib/prov/pkcs11/pkcs11f.h @@ -0,0 +1,938 @@ +/* + * 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 + diff --git a/src/lib/prov/pkcs11/pkcs11t.h b/src/lib/prov/pkcs11/pkcs11t.h new file mode 100644 index 000000000..c183ea974 --- /dev/null +++ b/src/lib/prov/pkcs11/pkcs11t.h @@ -0,0 +1,2002 @@ +/* + * 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_ */ + diff --git a/src/lib/prov/tpm/tpm.h b/src/lib/prov/tpm/tpm.h index 4a9dcd3c6..b8093518c 100644 --- a/src/lib/prov/tpm/tpm.h +++ b/src/lib/prov/tpm/tpm.h @@ -1,3 +1,4 @@ + /* * TPM 1.2 interface * (C) 2015 Jack Lloyd @@ -71,34 +72,27 @@ class BOTAN_DLL TPM_Context TSS_HTPM m_tpm; }; -class BOTAN_DLL TPM_RNG : public RandomNumberGenerator +class BOTAN_DLL TPM_RNG : public Hardware_RNG { public: TPM_RNG(TPM_Context& ctx) : m_ctx(ctx) {} + void add_entropy(const byte in[], size_t in_len) override + { + m_ctx.stir_random(in, in_len); + } + void randomize(byte out[], size_t out_len) override { m_ctx.gen_random(out, out_len); } - void clear() override {} - std::string name() const override { return "TPM_RNG"; } - size_t reseed_with_sources(Entropy_Sources&, - size_t, - std::chrono::milliseconds) override - { - // TODO: poll and stir - return 0; - } + bool is_seeded() const override { return true; } - void add_entropy(const byte in[], size_t in_len) override - { - m_ctx.stir_random(in, in_len); - } + void clear() override {} - bool is_seeded() const override { return true; } private: TPM_Context& m_ctx; }; diff --git a/src/lib/pubkey/curve25519/donna.cpp b/src/lib/pubkey/curve25519/donna.cpp index 9b28e412c..a0e4d249f 100644 --- a/src/lib/pubkey/curve25519/donna.cpp +++ b/src/lib/pubkey/curve25519/donna.cpp @@ -39,6 +39,26 @@ typedef byte u8; typedef u64bit 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 @@ -273,44 +293,41 @@ fcontract(u8 *output, const felem input) { /* Input: Q, Q', Q-Q' * Output: 2Q, Q+Q' * - * x2 z3: long form - * x3 z3: long form - * x z: short form, destroyed - * xprime zprime: short form, destroyed - * qmqp: short form, preserved + * 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(limb *x2, limb *z2, /* output 2Q */ - limb *x3, limb *z3, /* output Q + Q' */ - limb *x, limb *z, /* input Q */ - limb *xprime, limb *zprime, /* input Q' */ - const limb *qmqp /* input Q - Q' */) { +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]; + zzprime[5], zzzprime[5]; - copy_mem(origx, x, 5); - fsum(x, z); - fdifference_backwards(z, origx); // does x - z + 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, xprime, 5); - fsum(xprime, zprime); - fdifference_backwards(zprime, origxprime); - fmul(xxprime, xprime, z); - fmul(zzprime, x, zprime); + 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(x3, xxprime, 1); + fsquare_times(result.q_plus_q_dash.x, xxprime, 1); fsquare_times(zzzprime, zzprime, 1); - fmul(z3, zzzprime, qmqp); + fmul(result.q_plus_q_dash.z, zzzprime, in.q_minus_q_dash); - fsquare_times(xx, x, 1); - fsquare_times(zz, z, 1); - fmul(x2, xx, zz); + 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(z2, zz, zzz); + fmul(result.two_q.z, zz, zzz); } // ----------------------------------------------------------------------------- @@ -356,11 +373,10 @@ cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) { swap_conditional(nqx, nqpqx, bit); swap_conditional(nqz, nqpqz, bit); - fmonty(nqx2, nqz2, - nqpqx2, nqpqz2, - nqx, nqz, - nqpqx, nqpqz, - q); + + 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); diff --git a/src/lib/pubkey/dh/dh.cpp b/src/lib/pubkey/dh/dh.cpp index 9eb4e5cd0..8ed79aa3d 100644 --- a/src/lib/pubkey/dh/dh.cpp +++ b/src/lib/pubkey/dh/dh.cpp @@ -37,6 +37,7 @@ DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, const DL_Group& grp, const BigInt& x_arg) { + const bool generate = (x_arg == 0) ? true : false; m_group = grp; m_x = x_arg; @@ -47,12 +48,18 @@ DH_PrivateKey::DH_PrivateKey(RandomNumberGenerator& rng, } if(m_y == 0) + { m_y = power_mod(group_g(), m_x, group_p()); + } - if(m_x == 0) + if(generate) + { gen_check(rng); + } else + { load_check(rng); + } } /* diff --git a/src/lib/pubkey/dlies/dlies.cpp b/src/lib/pubkey/dlies/dlies.cpp index 2c98966b0..9666a1c23 100644 --- a/src/lib/pubkey/dlies/dlies.cpp +++ b/src/lib/pubkey/dlies/dlies.cpp @@ -1,6 +1,7 @@ /* * DLIES * (C) 1999-2007 Jack Lloyd +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -10,128 +11,204 @@ namespace Botan { -/* -* DLIES_Encryptor Constructor -*/ -DLIES_Encryptor::DLIES_Encryptor(const PK_Key_Agreement_Key& key, - KDF* kdf_obj, - MessageAuthenticationCode* mac_obj, - size_t mac_kl) : - m_ka(key, "Raw"), - m_kdf(kdf_obj), - m_mac(mac_obj), - m_mac_keylen(mac_kl) +DLIES_Encryptor::DLIES_Encryptor(const DH_PrivateKey& own_priv_key, + KDF* kdf, + MessageAuthenticationCode* mac, + size_t mac_key_length) : + DLIES_Encryptor(own_priv_key, kdf, nullptr, 0, mac, mac_key_length) { - BOTAN_ASSERT_NONNULL(kdf_obj); - BOTAN_ASSERT_NONNULL(mac_obj); - m_my_key = key.public_value(); } -/* -* DLIES Encryption -*/ +DLIES_Encryptor::DLIES_Encryptor(const DH_PrivateKey& own_priv_key, + 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, "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<byte> DLIES_Encryptor::enc(const byte in[], size_t length, RandomNumberGenerator&) const { - if(length > maximum_input_size()) - throw Invalid_Argument("DLIES: Plaintext too large"); - if(m_other_key.empty()) + if(m_other_pub_key.empty()) + { throw Invalid_State("DLIES: The other key was never set"); + } - secure_vector<byte> out(m_my_key.size() + length + m_mac->output_length()); - buffer_insert(out, 0, m_my_key); - buffer_insert(out, m_my_key.size(), in, length); + // calculate secret value + const SymmetricKey secret_value = m_ka.derive_key(0, m_other_pub_key); - secure_vector<byte> vz(m_my_key.begin(), m_my_key.end()); - vz += m_ka.derive_key(0, m_other_key).bits_of(); + // 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<byte> secret_keys = m_kdf->derive_key(required_key_length, secret_value.bits_of()); - const size_t K_LENGTH = length + m_mac_keylen; - secure_vector<byte> K = m_kdf->derive_key(K_LENGTH, vz); - - if(K.size() != K_LENGTH) + if(secret_keys.size() != required_key_length) + { throw Encoding_Error("DLIES: KDF did not provide sufficient output"); - byte* C = &out[m_my_key.size()]; - - m_mac->set_key(K.data(), m_mac_keylen); - xor_buf(C, &K[m_mac_keylen], length); - - m_mac->update(C, length); - for(size_t j = 0; j != 8; ++j) - m_mac->update(0); - - m_mac->final(C + length); + } + + secure_vector<byte> 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<byte> tag = m_mac->process(ciphertext); + + // out = (ephemeral) public key + ciphertext + tag + secure_vector<byte> 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); } -/* -* Set the other parties public key -*/ -void DLIES_Encryptor::set_other_key(const std::vector<byte>& ok) - { - m_other_key = ok; - } - -/* +/** * 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 { - return 32; + if(m_cipher) + { + // no limit in block cipher mode + return std::numeric_limits<size_t>::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 Constructor -*/ -DLIES_Decryptor::DLIES_Decryptor(const PK_Key_Agreement_Key& key, - KDF* kdf_obj, - MessageAuthenticationCode* mac_obj, - size_t mac_kl) : - m_ka(key, "Raw"), - m_kdf(kdf_obj), - m_mac(mac_obj), - m_mac_keylen(mac_kl) +DLIES_Decryptor::DLIES_Decryptor(const DH_PrivateKey& own_priv_key, + 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, "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() { - m_my_key = key.public_value(); + BOTAN_ASSERT_NONNULL(kdf); + BOTAN_ASSERT_NONNULL(mac); } -/* -* DLIES Decryption -*/ +DLIES_Decryptor::DLIES_Decryptor(const DH_PrivateKey& own_priv_key, + KDF* kdf, + MessageAuthenticationCode* mac, + size_t mac_key_length) : + DLIES_Decryptor(own_priv_key, kdf, nullptr, 0, mac, mac_key_length) + {} + secure_vector<byte> DLIES_Decryptor::do_decrypt(byte& valid_mask, - const byte msg[], size_t length) const + const byte msg[], size_t length) const { - if(length < m_my_key.size() + m_mac->output_length()) + if(length < m_pub_key_size + m_mac->output_length()) + { throw Decoding_Error("DLIES decryption: ciphertext is too short"); + } - const size_t CIPHER_LEN = length - m_my_key.size() - m_mac->output_length(); - - std::vector<byte> v(msg, msg + m_my_key.size()); + // calculate secret value + std::vector<byte> other_pub_key(msg, msg + m_pub_key_size); + const SymmetricKey secret_value = m_ka.derive_key(0, other_pub_key); - secure_vector<byte> C(msg + m_my_key.size(), msg + m_my_key.size() + CIPHER_LEN); + 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; - secure_vector<byte> T(msg + m_my_key.size() + CIPHER_LEN, - msg + m_my_key.size() + CIPHER_LEN + m_mac->output_length()); + // derive secret key from secret value + const size_t required_key_length = cipher_key_len + m_mac_keylen; + secure_vector<byte> secret_keys = m_kdf->derive_key(required_key_length, secret_value.bits_of()); - secure_vector<byte> vz(msg, msg + m_my_key.size()); - vz += m_ka.derive_key(0, v).bits_of(); - - const size_t K_LENGTH = C.size() + m_mac_keylen; - secure_vector<byte> K = m_kdf->derive_key(K_LENGTH, vz); - if(K.size() != K_LENGTH) + if(secret_keys.size() != required_key_length) + { throw Encoding_Error("DLIES: KDF did not provide sufficient output"); - - m_mac->set_key(K.data(), m_mac_keylen); - m_mac->update(C); - for(size_t j = 0; j != 8; ++j) - m_mac->update(0); - secure_vector<byte> T2 = m_mac->final(); - - valid_mask = CT::expand_mask<byte>(same_mem(T.data(), T2.data(), T.size())); - - xor_buf(C, K.data() + m_mac_keylen, C.size()); - - return C; + } + + secure_vector<byte> 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<byte> calculated_tag = m_mac->process(ciphertext); + + // calculated tag == received tag ? + secure_vector<byte> tag(msg + m_pub_key_size + ciphertext_len, + msg + m_pub_key_size + ciphertext_len + m_mac->output_length()); + + valid_mask = CT::expand_mask<byte>(same_mem(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<byte>(); + } + } + else + { + xor_buf(ciphertext, secret_keys.data(), cipher_key_len); + } + + return ciphertext; } } diff --git a/src/lib/pubkey/dlies/dlies.h b/src/lib/pubkey/dlies/dlies.h index 10471048d..5f7251d03 100644 --- a/src/lib/pubkey/dlies/dlies.h +++ b/src/lib/pubkey/dlies/dlies.h @@ -1,6 +1,7 @@ /* * DLIES * (C) 1999-2007 Jack Lloyd +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -11,6 +12,8 @@ #include <botan/pubkey.h> #include <botan/mac.h> #include <botan/kdf.h> +#include <botan/dh.h> +#include <botan/cipher_mode.h> namespace Botan { @@ -20,24 +23,67 @@ namespace Botan { class BOTAN_DLL DLIES_Encryptor : public PK_Encryptor { public: - DLIES_Encryptor(const PK_Key_Agreement_Key&, + /** + * 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 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, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); - void set_other_key(const std::vector<byte>&); + /** + * Block cipher mode + * + * @param own_priv_key own (ephemeral) DH private key + * @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, + 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<byte>& 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<byte> enc(const byte[], size_t, RandomNumberGenerator&) const override; size_t maximum_input_size() const override; - std::vector<byte> m_other_key, m_my_key; - + std::vector<byte> m_other_pub_key; + std::vector<byte> m_own_pub_key; PK_Key_Agreement m_ka; std::unique_ptr<KDF> m_kdf; + std::unique_ptr<Cipher_Mode> m_cipher; + const size_t m_cipher_key_len; std::unique_ptr<MessageAuthenticationCode> m_mac; - size_t m_mac_keylen; + const size_t m_mac_keylen; + InitializationVector m_iv; }; /** @@ -46,21 +92,58 @@ class BOTAN_DLL DLIES_Encryptor : public PK_Encryptor class BOTAN_DLL DLIES_Decryptor : public PK_Decryptor { public: - DLIES_Decryptor(const PK_Key_Agreement_Key&, + /** + * 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 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, KDF* kdf, MessageAuthenticationCode* mac, size_t mac_key_len = 20); + /** + * Block cipher mode + * + * @param own_priv_key own (ephemeral) DH private key + * @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, + 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<byte> do_decrypt(byte& valid_mask, const byte in[], size_t in_len) const override; - std::vector<byte> m_my_key; - + const size_t m_pub_key_size; PK_Key_Agreement m_ka; std::unique_ptr<KDF> m_kdf; + std::unique_ptr<Cipher_Mode> m_cipher; + const size_t m_cipher_key_len; std::unique_ptr<MessageAuthenticationCode> m_mac; - size_t m_mac_keylen; + const size_t m_mac_keylen; + InitializationVector m_iv; }; } diff --git a/src/lib/pubkey/dlies/info.txt b/src/lib/pubkey/dlies/info.txt index ec1bac803..30362ad78 100644 --- a/src/lib/pubkey/dlies/info.txt +++ b/src/lib/pubkey/dlies/info.txt @@ -1,6 +1,7 @@ -define DLIES 20131128 +define DLIES 20160713 <requires> kdf mac +block </requires> diff --git a/src/lib/pubkey/dsa/dsa.cpp b/src/lib/pubkey/dsa/dsa.cpp index 471189cd8..399756b1a 100644 --- a/src/lib/pubkey/dsa/dsa.cpp +++ b/src/lib/pubkey/dsa/dsa.cpp @@ -1,6 +1,7 @@ /* * DSA * (C) 1999-2010,2014 Jack Lloyd +* (C) 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -10,7 +11,10 @@ #include <botan/keypair.h> #include <botan/pow_mod.h> #include <botan/reducer.h> -#include <botan/rfc6979.h> +#if defined(BOTAN_HAS_RFC6979_GENERATOR) + #include <botan/rfc6979.h> + #include <botan/emsa.h> +#endif #include <future> namespace Botan { @@ -66,7 +70,7 @@ bool DSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const if(!strong) return true; - return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); + return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { @@ -84,7 +88,7 @@ class DSA_Signature_Operation : public PK_Ops::Signature_with_EMSA m_x(dsa.get_x()), m_powermod_g_p(dsa.group_g(), dsa.group_p()), m_mod_q(dsa.group_q()), - m_hash(hash_for_deterministic_signature(emsa)) + m_emsa(emsa) { } @@ -99,19 +103,24 @@ class DSA_Signature_Operation : public PK_Ops::Signature_with_EMSA const BigInt& m_x; Fixed_Base_Power_Mod m_powermod_g_p; Modular_Reducer m_mod_q; - std::string m_hash; + std::string m_emsa; }; secure_vector<byte> DSA_Signature_Operation::raw_sign(const byte msg[], size_t msg_len, - RandomNumberGenerator&) + RandomNumberGenerator& rng) { BigInt i(msg, msg_len); while(i >= m_q) i -= m_q; - const BigInt k = generate_rfc6979_nonce(m_x, m_q, i, m_hash); +#if defined(BOTAN_HAS_RFC6979_GENERATOR) + BOTAN_UNUSED(rng); + const BigInt k = generate_rfc6979_nonce(m_x, m_q, i, hash_for_emsa(m_emsa)); +#else + const BigInt k = BigInt::random_integer(rng, 1, m_q); +#endif auto future_r = std::async(std::launch::async, [&]() { return m_mod_q.reduce(m_powermod_g_p(k)); }); @@ -124,10 +133,7 @@ DSA_Signature_Operation::raw_sign(const byte msg[], size_t msg_len, BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); - secure_vector<byte> output(2*m_q.bytes()); - r.binary_encode(&output[output.size() / 2 - r.bytes()]); - s.binary_encode(&output[output.size() - s.bytes()]); - return output; + return BigInt::encode_fixed_length_int_pair(r, s, m_q.bytes()); } /** diff --git a/src/lib/pubkey/dsa/info.txt b/src/lib/pubkey/dsa/info.txt index 6e0259ce2..855363789 100644 --- a/src/lib/pubkey/dsa/info.txt +++ b/src/lib/pubkey/dsa/info.txt @@ -5,5 +5,6 @@ dl_algo dl_group keypair numbertheory -rfc6979 +emsa1 +sha2_32 </requires> diff --git a/src/lib/pubkey/ec_group/named.cpp b/src/lib/pubkey/ec_group/named.cpp index 3ee791053..6df8a3169 100644 --- a/src/lib/pubkey/ec_group/named.cpp +++ b/src/lib/pubkey/ec_group/named.cpp @@ -255,6 +255,16 @@ const char* EC_Group::PEM_for_named_group(const std::string& name) "/////////////////////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-----"; + return nullptr; } diff --git a/src/lib/pubkey/ecdsa/ecdsa.cpp b/src/lib/pubkey/ecdsa/ecdsa.cpp index 4a4b0c037..264a36963 100644 --- a/src/lib/pubkey/ecdsa/ecdsa.cpp +++ b/src/lib/pubkey/ecdsa/ecdsa.cpp @@ -3,6 +3,7 @@ * (C) 2007 Manuel Hartl, FlexSecure GmbH * 2007 Falko Strenzke, FlexSecure GmbH * 2008-2010,2015 Jack Lloyd +* 2016 René Korthaus * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -10,7 +11,10 @@ #include <botan/internal/pk_utils.h> #include <botan/ecdsa.h> #include <botan/keypair.h> -#include <botan/rfc6979.h> +#if defined(BOTAN_HAS_RFC6979_GENERATOR) + #include <botan/rfc6979.h> + #include <botan/emsa.h> +#endif namespace Botan { @@ -23,7 +27,7 @@ bool ECDSA_PrivateKey::check_key(RandomNumberGenerator& rng, if(!strong) return true; - return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); + return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { @@ -43,7 +47,7 @@ class ECDSA_Signature_Operation : public PK_Ops::Signature_with_EMSA m_base_point(ecdsa.domain().get_base_point(), m_order), m_x(ecdsa.private_value()), m_mod_order(m_order), - m_hash(hash_for_deterministic_signature(emsa)) + m_emsa(emsa) { } @@ -59,7 +63,7 @@ class ECDSA_Signature_Operation : public PK_Ops::Signature_with_EMSA Blinded_Point_Multiply m_base_point; const BigInt& m_x; Modular_Reducer m_mod_order; - std::string m_hash; + std::string m_emsa; }; secure_vector<byte> @@ -68,7 +72,11 @@ ECDSA_Signature_Operation::raw_sign(const byte msg[], size_t msg_len, { const BigInt m(msg, msg_len); - const BigInt k = generate_rfc6979_nonce(m_x, m_order, m, m_hash); +#if defined(BOTAN_HAS_RFC6979_GENERATOR) + const BigInt k = generate_rfc6979_nonce(m_x, m_order, m, hash_for_emsa(m_emsa)); +#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()); @@ -78,10 +86,7 @@ ECDSA_Signature_Operation::raw_sign(const byte msg[], size_t msg_len, BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); - secure_vector<byte> output(2*m_order.bytes()); - r.binary_encode(&output[output.size() / 2 - r.bytes()]); - s.binary_encode(&output[output.size() - s.bytes()]); - return output; + return BigInt::encode_fixed_length_int_pair(r, s, m_order.bytes()); } /** diff --git a/src/lib/pubkey/ecdsa/info.txt b/src/lib/pubkey/ecdsa/info.txt index e7941d53d..3b12bff0d 100644 --- a/src/lib/pubkey/ecdsa/info.txt +++ b/src/lib/pubkey/ecdsa/info.txt @@ -7,5 +7,6 @@ ecc_key keypair numbertheory rng -rfc6979 +emsa1 +sha2_32 </requires> diff --git a/src/lib/pubkey/ecgdsa/ecgdsa.cpp b/src/lib/pubkey/ecgdsa/ecgdsa.cpp index b28e3fe96..30ea32817 100644 --- a/src/lib/pubkey/ecgdsa/ecgdsa.cpp +++ b/src/lib/pubkey/ecgdsa/ecgdsa.cpp @@ -20,7 +20,7 @@ bool ECGDSA_PrivateKey::check_key(RandomNumberGenerator& rng, if(!strong) return true; - return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-1)"); + return KeyPair::signature_consistency_check(rng, *this, "EMSA1(SHA-256)"); } namespace { @@ -73,10 +73,7 @@ ECGDSA_Signature_Operation::raw_sign(const byte msg[], size_t msg_len, BOTAN_ASSERT(s != 0, "invalid s"); BOTAN_ASSERT(r != 0, "invalid r"); - secure_vector<byte> output(2*m_order.bytes()); - r.binary_encode(&output[output.size() / 2 - r.bytes()]); - s.binary_encode(&output[output.size() - s.bytes()]); - return output; + return BigInt::encode_fixed_length_int_pair(r, s, m_order.bytes()); } /** diff --git a/src/lib/pubkey/ecgdsa/info.txt b/src/lib/pubkey/ecgdsa/info.txt index 6c18a1440..79dec3199 100644 --- a/src/lib/pubkey/ecgdsa/info.txt +++ b/src/lib/pubkey/ecgdsa/info.txt @@ -8,4 +8,6 @@ ecc_key keypair numbertheory rng +emsa1 +sha2_32 </requires> diff --git a/src/lib/pubkey/ecies/ecies.cpp b/src/lib/pubkey/ecies/ecies.cpp new file mode 100644 index 000000000..d44d14803 --- /dev/null +++ b/src/lib/pubkey/ecies/ecies.cpp @@ -0,0 +1,398 @@ +/* +* ECIES +* (C) 2016 Philipp Weber +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/ecies.h> +#include <botan/cipher_mode.h> + +#include <botan/internal/ct_utils.h> +#include <botan/internal/pk_utils.h> + +namespace Botan { + +namespace { + +/** +* Private key type for ECIES_ECDH_KA_Operation +*/ +class ECIES_PrivateKey : 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<byte> public_value() const override + { + return m_key.public_value(); + } + + std::string algo_name() const override + { + return "ECIES"; + } + + size_t max_input_bits() const override + { + return m_key.max_input_bits(); + } + + private: + ECDH_PrivateKey m_key; + }; + +/** +* Implements ECDH key agreement without using the cofactor mode +*/ +class ECIES_ECDH_KA_Operation : public PK_Ops::Key_Agreement_with_KDF + { + public: + typedef ECIES_PrivateKey Key_Type; + + ECIES_ECDH_KA_Operation(const ECIES_PrivateKey& private_key, const std::string&) : + PK_Ops::Key_Agreement_with_KDF("Raw"), + m_key(private_key) + { + } + + secure_vector<byte> raw_agree(const byte w[], size_t w_len) override + { + const CurveGFp& curve = m_key.domain().get_curve(); + PointGFp point = OS2ECP(w, w_len, curve); + PointGFp S = point * m_key.private_value(); + 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; + }; + +/** +* 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) + { + const ECDH_PrivateKey* ecdh_key = dynamic_cast<const ECDH_PrivateKey*>(&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), "Raw"); + } + + return PK_Key_Agreement(private_key, "Raw"); // use default implementation + } +} + +BOTAN_REGISTER_PK_KEY_AGREE_OP("ECIES", ECIES_ECDH_KA_Operation); + +ECIES_KA_Operation::ECIES_KA_Operation(const PK_Key_Agreement_Key& private_key, const ECIES_KA_Params& ecies_params, + bool for_encryption) : + m_ka(create_key_agreement(private_key, ecies_params, for_encryption)), + m_params(ecies_params) + { + } + +/** +* ECIES secret derivation according to ISO 18033-2 +*/ +SymmetricKey ECIES_KA_Operation::derive_secret(const std::vector<byte>& 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> kdf = m_params.create_kdf(); + BOTAN_ASSERT(kdf != nullptr, "KDF is found"); + + 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<byte> 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<byte> other_public_key_bin = EC2OSP(other_point, static_cast<byte>(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) + { + } + +std::unique_ptr<KDF> ECIES_KA_Params::create_kdf() const + { + std::unique_ptr<KDF> kdf = Botan::KDF::create(m_kdf_spec); + if(kdf == nullptr) + { + throw Algorithm_Not_Found(m_kdf_spec); + } + return kdf; + } + + +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(cofactor_mode() + old_cofactor_mode() + 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<MessageAuthenticationCode> ECIES_System_Params::create_mac() const + { + std::unique_ptr<MessageAuthenticationCode> mac = Botan::MessageAuthenticationCode::create(m_mac_spec); + if(mac == nullptr) + { + throw Algorithm_Not_Found(m_mac_spec); + } + return mac; + } + +std::unique_ptr<Cipher_Mode> 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_Mode>(cipher); + } + + +/* +* ECIES_Encryptor Constructor +*/ +ECIES_Encryptor::ECIES_Encryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params) : + m_ka(private_key, ecies_params, true), + 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<byte>(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) + { + } + + +/* +* ECIES Encryption according to ISO 18033-2 +*/ +std::vector<byte> ECIES_Encryptor::enc(const byte 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_Mode> 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<byte> encrypted_data(data, data + length); + cipher->finish(encrypted_data); + + // concat elements + std::unique_ptr<MessageAuthenticationCode> mac = m_params.create_mac(); + BOTAN_ASSERT(mac != nullptr, "MAC is found"); + + secure_vector<byte> 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) : + m_ka(key, ecies_params, false), + 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<byte> ECIES_Decryptor::do_decrypt(byte& valid_mask, const byte 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<MessageAuthenticationCode> 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<byte> other_public_key_bin(in, in + point_size); // the received (ephemeral) public key + const std::vector<byte> encrypted_data(in + point_size, in + in_len - mac->output_length()); + const std::vector<byte> 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<byte> calculated_mac = mac->final(); + valid_mask = CT::expand_mask<byte>(same_mem(mac_data.data(), calculated_mac.data(), mac_data.size())); + + if(valid_mask) + { + // decrypt data + std::unique_ptr<Cipher_Mode> 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<byte> decrypted_data(encrypted_data.begin(), encrypted_data.end()); + cipher->finish(decrypted_data); + return decrypted_data; + } + catch(...) + { + valid_mask = 0; + } + } + return secure_vector<byte>(); + } + +} diff --git a/src/lib/pubkey/ecies/ecies.h b/src/lib/pubkey/ecies/ecies.h new file mode 100644 index 000000000..0bc0bf76e --- /dev/null +++ b/src/lib/pubkey/ecies/ecies.h @@ -0,0 +1,293 @@ +/* +* 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 <botan/ecdh.h> +#include <botan/ec_group.h> +#include <botan/kdf.h> +#include <botan/cipher_mode.h> +#include <botan/mac.h> +#include <botan/point_gfp.h> +#include <botan/pubkey.h> +#include <botan/secmem.h> +#include <botan/symkey.h> +#include <memory> +#include <string> +#include <vector> + +namespace Botan { + +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<ECIES_Flags>(static_cast<uint32_t>(a) | static_cast<uint32_t>(b)); + } + +inline ECIES_Flags operator &(ECIES_Flags a, ECIES_Flags b) + { + return static_cast<ECIES_Flags>(static_cast<uint32_t>(a) & static_cast<uint32_t>(b)); + } + +/** +* Parameters for ecies secret derivation +*/ +class BOTAN_DLL 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); + + virtual ~ECIES_KA_Params() = default; + + std::unique_ptr<KDF> create_kdf() const; + + 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; + } + + 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_DLL ECIES_System_Params : 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); + + virtual ~ECIES_System_Params() = default; + + /// creates an instance of the message authentication code + std::unique_ptr<MessageAuthenticationCode> create_mac() const; + + /// creates an instance of the data encryption method + std::unique_ptr<Cipher_Mode> 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_DLL 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) + */ + ECIES_KA_Operation(const PK_Key_Agreement_Key& private_key, const ECIES_KA_Params& ecies_params, + bool for_encryption); + + /** + * 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<byte>& 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_DLL ECIES_Encryptor : public PK_Encryptor + { + public: + /** + * @param private_key the (ephemeral) private key which is used for the key agreement + * @param ecies_params settings for ecies + */ + ECIES_Encryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params); + + /** + * 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<byte>(label.begin(), label.end()); + } + + private: + std::vector<byte> enc(const byte data[], size_t length, RandomNumberGenerator&) const override; + + inline size_t maximum_input_size() const override + { + return std::numeric_limits<size_t>::max(); + } + + const ECIES_KA_Operation m_ka; + const ECIES_System_Params m_params; + std::vector<byte> m_eph_public_key_bin; + InitializationVector m_iv; + PointGFp m_other_point; + std::vector<byte> m_label; + }; + + +/** +* ECIES Decryption according to ISO 18033-2 +*/ +class BOTAN_DLL ECIES_Decryptor : public PK_Decryptor + { + public: + /** + * @param private_key the private key which is used for the key agreement + * @param ecies_params settings for ecies + */ + ECIES_Decryptor(const PK_Key_Agreement_Key& private_key, const ECIES_System_Params& ecies_params); + + /// 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<byte>(label.begin(), label.end()); + } + + private: + secure_vector<byte> do_decrypt(byte& valid_mask, const byte in[], size_t in_len) const override; + + const ECIES_KA_Operation m_ka; + const ECIES_System_Params m_params; + InitializationVector m_iv; + std::vector<byte> m_label; + }; + +} + +#endif diff --git a/src/lib/pubkey/ecies/info.txt b/src/lib/pubkey/ecies/info.txt new file mode 100644 index 000000000..12776f8c2 --- /dev/null +++ b/src/lib/pubkey/ecies/info.txt @@ -0,0 +1,8 @@ +define ECIES 20160128 + +<requires> +kdf +mac +ecdh +modes +</requires>
\ No newline at end of file diff --git a/src/lib/pubkey/eckcdsa/eckcdsa.cpp b/src/lib/pubkey/eckcdsa/eckcdsa.cpp new file mode 100644 index 000000000..5ca89675c --- /dev/null +++ b/src/lib/pubkey/eckcdsa/eckcdsa.cpp @@ -0,0 +1,200 @@ +/* +* 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 <botan/internal/pk_utils.h> +#include <botan/eckcdsa.h> +#include <botan/keypair.h> +#include <botan/emsa.h> +#include <botan/hash.h> + +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-1)"); + } + +namespace { + +/** +* ECKCDSA signature operation +*/ +class ECKCDSA_Signature_Operation : public PK_Ops::Signature_with_EMSA + { + public: + typedef ECKCDSA_PrivateKey Key_Type; + + 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<byte> raw_sign(const byte msg[], size_t msg_len, + RandomNumberGenerator& rng) override; + + size_t message_parts() const override { return 2; } + size_t message_part_size() const override { return m_order.bytes(); } + size_t max_input_bits() const override { return m_order.bits(); } + + bool has_prefix() override { return true; } + secure_vector<byte> 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<byte> m_prefix; + }; + +secure_vector<byte> +ECKCDSA_Signature_Operation::raw_sign(const byte 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<byte> to_be_hashed(k_times_P_x.bytes()); + k_times_P_x.binary_encode(to_be_hashed.data()); + + std::unique_ptr<EMSA> emsa(m_emsa->clone()); + emsa->update(to_be_hashed.data(), to_be_hashed.size()); + secure_vector<byte> 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<byte> output = BigInt::encode_1363(r, c.size()); + output += BigInt::encode_1363(s, m_mod_order.get_modulus().bytes()); + return output; + } + +/** +* ECKCDSA verification operation +*/ +class ECKCDSA_Verification_Operation : public PK_Ops::Verification_with_EMSA + { + public: + typedef ECKCDSA_PublicKey Key_Type; + + 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<byte> message_prefix() const override { return m_prefix; } + + size_t message_parts() const override { return 2; } + size_t message_part_size() const override { return m_order.bytes(); } + size_t max_input_bits() const override { return m_order.bits(); } + + bool with_recovery() const override { return false; } + + bool verify(const byte msg[], size_t msg_len, + const byte 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<byte> m_prefix; + }; + +bool ECKCDSA_Verification_Operation::verify(const byte msg[], size_t, + const byte sig[], size_t sig_len) + { + // check that bit length of r is equal to output bit length of employed hash function h + const std::unique_ptr<HashFunction> hash = HashFunction::create(hash_for_signature()); + + // no way to know size of r in sig, so check that we have at least hash->output_length()+1 + // bytes in sig, enough for r and an arbitrary size s + if(sig_len <= hash->output_length()) + { + return false; + } + + secure_vector<byte> r(sig, sig + hash->output_length()); + + // check that 0 < s < q + const BigInt s(sig + hash->output_length(), sig_len - hash->output_length()); + + if(s <= 0 || s >= m_order) + { + return false; + } + + secure_vector<byte> 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 = (m_base_point * w) + (m_public_point * s); + const BigInt q_x = q.get_affine_x(); + secure_vector<byte> c(q_x.bytes()); + q_x.binary_encode(c.data()); + std::unique_ptr<EMSA> emsa(m_emsa->clone()); + emsa->update(c.data(), c.size()); + secure_vector<byte> v = emsa->raw_data(); + Null_RNG rng; + v = emsa->encoding_of(v, max_input_bits(), rng); + + return (v == r); + } + +BOTAN_REGISTER_PK_SIGNATURE_OP("ECKCDSA", ECKCDSA_Signature_Operation); +BOTAN_REGISTER_PK_VERIFY_OP("ECKCDSA", ECKCDSA_Verification_Operation); + +} + +} diff --git a/src/lib/pubkey/eckcdsa/eckcdsa.h b/src/lib/pubkey/eckcdsa/eckcdsa.h new file mode 100644 index 000000000..b85c4025e --- /dev/null +++ b/src/lib/pubkey/eckcdsa/eckcdsa.h @@ -0,0 +1,91 @@ +/* +* 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 <botan/ecc_key.h> + +namespace Botan { + +/** +* This class represents ECKCDSA public keys. +*/ +class BOTAN_DLL 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) {} + + ECKCDSA_PublicKey(const AlgorithmIdentifier& alg_id, + const secure_vector<byte>& 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"; } + + /** + * Get the maximum number of bits allowed to be fed to this key. + * This is the bitlength of the order of the base point. + * @result the maximum number of input bits + */ + size_t max_input_bits() const override + { return domain().get_order().bits(); } + + size_t message_parts() const override { return 2; } + + size_t message_part_size() const override + { return domain().get_order().bytes(); } + + protected: + ECKCDSA_PublicKey() {} + }; + +/** +* This class represents ECKCDSA private keys. +*/ +class BOTAN_DLL ECKCDSA_PrivateKey : public ECKCDSA_PublicKey, + public EC_PrivateKey + { + public: + + /** + * Load a private key + * @param alg_id the X.509 algorithm identifier + * @param key_bits PKCS #8 structure + */ + ECKCDSA_PrivateKey(const AlgorithmIdentifier& alg_id, + const secure_vector<byte>& 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) + */ + 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; + }; + +} + +#endif diff --git a/src/lib/pubkey/eckcdsa/info.txt b/src/lib/pubkey/eckcdsa/info.txt new file mode 100644 index 000000000..d3df354b1 --- /dev/null +++ b/src/lib/pubkey/eckcdsa/info.txt @@ -0,0 +1,13 @@ +define ECKCDSA 20160413 + +<requires> +asn1 +bigint +ec_group +ecc_key +hash +keypair +numbertheory +pk_pad +rng +</requires> diff --git a/src/lib/pubkey/pk_algs.cpp b/src/lib/pubkey/pk_algs.cpp index d2947b0c0..9dbde28af 100644 --- a/src/lib/pubkey/pk_algs.cpp +++ b/src/lib/pubkey/pk_algs.cpp @@ -28,6 +28,10 @@ #include <botan/ecgdsa.h> #endif +#if defined(BOTAN_HAS_ECKCDSA) + #include <botan/eckcdsa.h> +#endif + #if defined(BOTAN_HAS_GOST_34_10_2001) #include <botan/gost_3410.h> #endif @@ -105,6 +109,11 @@ Public_Key* make_public_key(const AlgorithmIdentifier& alg_id, return new ECGDSA_PublicKey(alg_id, key_bits); #endif +#if defined(BOTAN_HAS_ECKCDSA) + if(alg_name == "ECKCDSA") + return new ECKCDSA_PublicKey(alg_id, key_bits); +#endif + #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return new GOST_3410_PublicKey(alg_id, key_bits); @@ -176,6 +185,11 @@ Private_Key* make_private_key(const AlgorithmIdentifier& alg_id, return new ECGDSA_PrivateKey(alg_id, key_bits); #endif +#if defined(BOTAN_HAS_ECKCDSA) + if(alg_name == "ECKCDSA") + return new ECKCDSA_PrivateKey(alg_id, key_bits); +#endif + #if defined(BOTAN_HAS_GOST_34_10_2001) if(alg_name == "GOST-34.10") return new GOST_3410_PrivateKey(alg_id, key_bits); diff --git a/src/lib/pubkey/pk_ops.cpp b/src/lib/pubkey/pk_ops.cpp index 654b68255..1017518a7 100644 --- a/src/lib/pubkey/pk_ops.cpp +++ b/src/lib/pubkey/pk_ops.cpp @@ -76,9 +76,12 @@ secure_vector<byte> PK_Ops::Key_Agreement_with_KDF::agree(size_t key_len, return z; } -PK_Ops::Signature_with_EMSA::Signature_with_EMSA(const std::string& emsa) +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) { - m_emsa.reset(get_emsa(emsa)); if(!m_emsa) throw Algorithm_Not_Found(emsa); } @@ -87,19 +90,29 @@ PK_Ops::Signature_with_EMSA::~Signature_with_EMSA() {} void PK_Ops::Signature_with_EMSA::update(const byte msg[], size_t msg_len) { + if(has_prefix() && !m_prefix_used) + { + m_prefix_used = true; + secure_vector<byte> prefix = message_prefix(); + m_emsa->update(prefix.data(), prefix.size()); + } m_emsa->update(msg, msg_len); } secure_vector<byte> PK_Ops::Signature_with_EMSA::sign(RandomNumberGenerator& rng) { + m_prefix_used = false; const secure_vector<byte> 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) +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) { - m_emsa.reset(get_emsa(emsa)); if(!m_emsa) throw Algorithm_Not_Found(emsa); } @@ -108,11 +121,18 @@ PK_Ops::Verification_with_EMSA::~Verification_with_EMSA() {} void PK_Ops::Verification_with_EMSA::update(const byte msg[], size_t msg_len) { + if(has_prefix() && !m_prefix_used) + { + m_prefix_used = true; + secure_vector<byte> 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 byte sig[], size_t sig_len) { + m_prefix_used = false; const secure_vector<byte> msg = m_emsa->raw_data(); if(with_recovery()) diff --git a/src/lib/pubkey/pk_ops_impl.h b/src/lib/pubkey/pk_ops_impl.h index 81637a81c..9d02de5e5 100644 --- a/src/lib/pubkey/pk_ops_impl.h +++ b/src/lib/pubkey/pk_ops_impl.h @@ -58,12 +58,25 @@ class Verification_with_EMSA : public Verification bool do_check(const secure_vector<byte>& msg, const byte sig[], size_t sig_len); + std::string hash_for_signature() { return m_hash; } protected: explicit Verification_with_EMSA(const std::string& emsa); ~Verification_with_EMSA(); /** + * @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<byte> 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() */ @@ -95,8 +108,11 @@ class Verification_with_EMSA : public Verification throw Invalid_State("Message recovery not supported"); } - private: std::unique_ptr<EMSA> m_emsa; + + private: + const std::string m_hash; + bool m_prefix_used; }; class Signature_with_EMSA : public Signature @@ -108,6 +124,22 @@ class Signature_with_EMSA : public Signature protected: explicit Signature_with_EMSA(const std::string& emsa); ~Signature_with_EMSA(); + + 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<byte> message_prefix() const { throw Exception( "No prefix" ); } + + std::unique_ptr<EMSA> m_emsa; private: /** @@ -122,7 +154,8 @@ class Signature_with_EMSA : public Signature virtual secure_vector<byte> raw_sign(const byte msg[], size_t msg_len, RandomNumberGenerator& rng) = 0; - std::unique_ptr<EMSA> m_emsa; + const std::string m_hash; + bool m_prefix_used; }; class Key_Agreement_with_KDF : public Key_Agreement diff --git a/src/lib/pubkey/pubkey.cpp b/src/lib/pubkey/pubkey.cpp index c0485fec8..8b24ee983 100644 --- a/src/lib/pubkey/pubkey.cpp +++ b/src/lib/pubkey/pubkey.cpp @@ -54,7 +54,7 @@ PK_Decryptor::decrypt_or_random(const byte in[], { const secure_vector<byte> fake_pms = rng.random_vec(expected_pt_len); - CT::poison(in, length); + //CT::poison(in, length); byte valid_mask = 0; secure_vector<byte> decoded = do_decrypt(valid_mask, in, length); @@ -90,8 +90,8 @@ PK_Decryptor::decrypt_or_random(const byte in[], /*from1*/fake_pms.data(), expected_pt_len); - CT::unpoison(in, length); - CT::unpoison(decoded.data(), decoded.size()); + //CT::unpoison(in, length); + //CT::unpoison(decoded.data(), decoded.size()); return decoded; } diff --git a/src/lib/pubkey/rfc6979/rfc6979.cpp b/src/lib/pubkey/rfc6979/rfc6979.cpp index f749b039f..94b313c3a 100644 --- a/src/lib/pubkey/rfc6979/rfc6979.cpp +++ b/src/lib/pubkey/rfc6979/rfc6979.cpp @@ -8,41 +8,32 @@ #include <botan/rfc6979.h> #include <botan/hmac_drbg.h> #include <botan/mac.h> -#include <botan/scan_name.h> namespace Botan { -std::string hash_for_deterministic_signature(const std::string& emsa) - { - SCAN_Name emsa_name(emsa); - - 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 - } - 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_hmac_drbg(new HMAC_DRBG(MessageAuthenticationCode::create("HMAC(" + hash + ")").release())), 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->add_entropy(m_rng_in.data(), m_rng_in.size()); + m_hmac_drbg->initialize_with(m_rng_in.data(), m_rng_in.size()); do { diff --git a/src/lib/pubkey/rfc6979/rfc6979.h b/src/lib/pubkey/rfc6979/rfc6979.h index 5b3dee8ef..2518535f7 100644 --- a/src/lib/pubkey/rfc6979/rfc6979.h +++ b/src/lib/pubkey/rfc6979/rfc6979.h @@ -14,7 +14,7 @@ namespace Botan { -class RandomNumberGenerator; +class HMAC_DRBG; class BOTAN_DLL RFC6979_Nonce_Generator { @@ -26,12 +26,14 @@ class BOTAN_DLL RFC6979_Nonce_Generator 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<RandomNumberGenerator> m_hmac_drbg; + std::unique_ptr<HMAC_DRBG> m_hmac_drbg; secure_vector<byte> m_rng_in, m_rng_out; }; @@ -46,8 +48,6 @@ BigInt BOTAN_DLL generate_rfc6979_nonce(const BigInt& x, const BigInt& h, const std::string& hash); -std::string hash_for_deterministic_signature(const std::string& emsa); - } #endif diff --git a/src/lib/pubkey/rsa/info.txt b/src/lib/pubkey/rsa/info.txt index 264ff7c62..91eec565a 100644 --- a/src/lib/pubkey/rsa/info.txt +++ b/src/lib/pubkey/rsa/info.txt @@ -4,4 +4,6 @@ define RSA 20131128 if_algo keypair numbertheory +emsa_pssr +sha2_32 </requires> diff --git a/src/lib/pubkey/rsa/rsa.cpp b/src/lib/pubkey/rsa/rsa.cpp index e12586014..6a645ec88 100644 --- a/src/lib/pubkey/rsa/rsa.cpp +++ b/src/lib/pubkey/rsa/rsa.cpp @@ -58,7 +58,7 @@ bool RSA_PrivateKey::check_key(RandomNumberGenerator& rng, bool strong) const if((m_e * m_d) % lcm(m_p - 1, m_q - 1) != 1) return false; - return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-1)"); + return KeyPair::signature_consistency_check(rng, *this, "EMSA4(SHA-256)"); } namespace { diff --git a/src/lib/rng/auto_rng/auto_rng.cpp b/src/lib/rng/auto_rng/auto_rng.cpp new file mode 100644 index 000000000..a9da085bc --- /dev/null +++ b/src/lib/rng/auto_rng/auto_rng.cpp @@ -0,0 +1,116 @@ +/* +* (C) 2016 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/auto_rng.h> +#include <botan/entropy_src.h> + +#if defined(BOTAN_HAS_HMAC_DRBG) + #include <botan/hmac_drbg.h> +#endif + +#if defined(BOTAN_HAS_HMAC_RNG) + #include <botan/hmac_rng.h> +#endif + +#if defined(BOTAN_HAS_SYSTEM_RNG) + #include <botan/system_rng.h> +#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 BOTAN_AUTO_RNG_DRBG(MessageAuthenticationCode::create(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 BOTAN_AUTO_RNG_DRBG(MessageAuthenticationCode::create(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 BOTAN_AUTO_RNG_DRBG(MessageAuthenticationCode::create(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 byte 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(byte output[], size_t output_len) + { + randomize_with_ts_input(output, output_len); + } + +void AutoSeeded_RNG::randomize_with_input(byte output[], size_t output_len, + const byte ad[], size_t ad_len) + { + m_rng->randomize_with_input(output, output_len, ad, ad_len); + } + +} diff --git a/src/lib/rng/auto_rng/auto_rng.h b/src/lib/rng/auto_rng/auto_rng.h index 72ea88d3e..6ef1aa291 100644 --- a/src/lib/rng/auto_rng/auto_rng.h +++ b/src/lib/rng/auto_rng/auto_rng.h @@ -1,6 +1,6 @@ /* * Auto Seeded RNG -* (C) 2008 Jack Lloyd +* (C) 2008,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,35 +9,57 @@ #define BOTAN_AUTO_SEEDING_RNG_H__ #include <botan/rng.h> -#include <string> namespace Botan { -class AutoSeeded_RNG : public RandomNumberGenerator +class Stateful_RNG; + +/** +* A userspace PRNG +*/ +class BOTAN_DLL AutoSeeded_RNG final : public RandomNumberGenerator { public: - void randomize(byte out[], size_t len) override - { m_rng->randomize(out, len); } + void randomize(byte out[], size_t len) override; + + void randomize_with_input(byte output[], size_t output_len, + const byte input[], size_t input_len) override; + + bool is_seeded() const override; + + 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 byte in[], size_t len) override; + + std::string name() const override; + + void clear() override; - bool is_seeded() const override { return m_rng->is_seeded(); } + /** + * If no RNG or entropy sources are provided to AutoSeeded_RNG, it uses the system RNG + * (if available) or else a default group of entropy sources (all other systems) to + * gather seed material. + */ + AutoSeeded_RNG(size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - void clear() override { m_rng->clear(); } + AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - std::string name() const override { return m_rng->name(); } + AutoSeeded_RNG(Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - size_t reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) override - { - return m_rng->reseed_with_sources(srcs, poll_bits, poll_timeout); - } + AutoSeeded_RNG(RandomNumberGenerator& underlying_rng, + Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - void add_entropy(const byte in[], size_t len) override - { m_rng->add_entropy(in, len); } + ~AutoSeeded_RNG(); - AutoSeeded_RNG() : m_rng(RandomNumberGenerator::make_rng()) {} private: - std::unique_ptr<RandomNumberGenerator> m_rng; + std::unique_ptr<Stateful_RNG> m_rng; }; } diff --git a/src/lib/rng/auto_rng/info.txt b/src/lib/rng/auto_rng/info.txt index 4f48f484b..b77e6aa54 100644 --- a/src/lib/rng/auto_rng/info.txt +++ b/src/lib/rng/auto_rng/info.txt @@ -1,9 +1 @@ -define AUTO_SEEDING_RNG 20131128 - -<requires> -hmac_rng -hmac -sha2_32 -sha2_64 -#dev_random|cryptoapi_rng|unix_procs|proc_walk -</requires> +define AUTO_SEEDING_RNG 20160821 diff --git a/src/lib/rng/hmac_drbg/hmac_drbg.cpp b/src/lib/rng/hmac_drbg/hmac_drbg.cpp index 67325ee1b..6ea66aa2e 100644 --- a/src/lib/rng/hmac_drbg/hmac_drbg.cpp +++ b/src/lib/rng/hmac_drbg/hmac_drbg.cpp @@ -1,6 +1,6 @@ /* * HMAC_DRBG -* (C) 2014,2015 Jack Lloyd +* (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -10,53 +10,116 @@ namespace Botan { -HMAC_DRBG::HMAC_DRBG(MessageAuthenticationCode* mac, - RandomNumberGenerator* prng) : - m_mac(mac), - m_prng(prng), - m_V(m_mac->output_length(), 0x01), - m_reseed_counter(0) +HMAC_DRBG::HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + size_t reseed_interval) : + Stateful_RNG(underlying_rng, reseed_interval), + m_mac(std::move(prf)) { - m_mac->set_key(std::vector<byte>(m_mac->output_length(), 0x00)); + BOTAN_ASSERT_NONNULL(m_mac); + clear(); + } + +HMAC_DRBG::HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + Entropy_Sources& entropy_sources, + size_t reseed_interval) : + Stateful_RNG(underlying_rng, entropy_sources, reseed_interval), + m_mac(std::move(prf)) + { + BOTAN_ASSERT_NONNULL(m_mac); + clear(); + } + +HMAC_DRBG::HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + Entropy_Sources& entropy_sources, + size_t reseed_interval) : + Stateful_RNG(entropy_sources, reseed_interval), + m_mac(std::move(prf)) + { + BOTAN_ASSERT_NONNULL(m_mac); + clear(); } -HMAC_DRBG::HMAC_DRBG(const std::string& mac_name, - RandomNumberGenerator* prng) : - m_prng(prng), - m_reseed_counter(0) +HMAC_DRBG::HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf) : + Stateful_RNG(), + m_mac(std::move(prf)) { - m_mac = MessageAuthenticationCode::create(mac_name); - if(!m_mac) - throw Algorithm_Not_Found(mac_name); - m_V = secure_vector<byte>(m_mac->output_length(), 0x01), + 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<byte>(m_mac->output_length(), 0x00)); } -void HMAC_DRBG::randomize(byte out[], size_t length) +std::string HMAC_DRBG::name() const { - if(!is_seeded() || m_reseed_counter > BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED) - reseed(m_mac->output_length() * 8); + return "HMAC_DRBG(" + m_mac->name() + ")"; + } - if(!is_seeded()) - throw PRNG_Unseeded(name()); +void HMAC_DRBG::randomize(byte output[], size_t output_len) + { + randomize_with_input(output, output_len, nullptr, 0); + } - while(length) +/* +* HMAC_DRBG generation +* See NIST SP800-90A section 10.1.2.5 +*/ +void HMAC_DRBG::randomize_with_input(byte output[], size_t output_len, + const byte input[], size_t input_len) + { + /** + * SP 800-90A requires we reject any request for a DRBG output + * longer than max_number_of_bits_per_request. This is an + * implementation-dependent value, but NIST requires for HMAC_DRBG + * that every implementation set a value no more than 2**19 bits + * (or 64 KiB). + * + * To avoid inconveniencing the caller who wants a large output for + * whatever reason, instead treat very long output requests as + * if multiple maximum-length requests had been made. + */ + const size_t max_number_of_bytes_per_request = 64*1024; + + while(output_len > 0) { - const size_t to_copy = std::min(length, m_V.size()); - m_V = m_mac->process(m_V); - copy_mem(out, m_V.data(), to_copy); + size_t this_req = std::min(max_number_of_bytes_per_request, output_len); + output_len -= this_req; - length -= to_copy; - out += to_copy; - } + reseed_check(); - m_reseed_counter += length; + 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); + } - update(nullptr, 0); // additional_data is always empty } /* * Reset V and the mac key with new values +* See NIST SP800-90A section 10.1.2.2 */ void HMAC_DRBG::update(const byte input[], size_t input_len) { @@ -65,66 +128,30 @@ void HMAC_DRBG::update(const byte input[], size_t input_len) m_mac->update(input, input_len); m_mac->set_key(m_mac->final()); - m_V = m_mac->process(m_V); + m_mac->update(m_V.data(), m_V.size()); + m_mac->final(m_V.data()); - if(input_len) + 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_V = m_mac->process(m_V); - } - } - -size_t HMAC_DRBG::reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) - { - if(m_prng) - { - size_t bits = m_prng->reseed_with_sources(srcs, poll_bits, poll_timeout); - - if(m_prng->is_seeded()) - { - secure_vector<byte> input = m_prng->random_vec(m_mac->output_length()); - update(input.data(), input.size()); - m_reseed_counter = 1; - } - - return bits; + m_mac->update(m_V.data(), m_V.size()); + m_mac->final(m_V.data()); } - - return 0; } -void HMAC_DRBG::add_entropy(const byte input[], size_t length) +void HMAC_DRBG::add_entropy(const byte input[], size_t input_len) { - update(input, length); - m_reseed_counter = 1; + update(input, input_len); } -bool HMAC_DRBG::is_seeded() const +size_t HMAC_DRBG::security_level() const { - return m_reseed_counter > 0; - } - -void HMAC_DRBG::clear() - { - m_reseed_counter = 0; - for(size_t i = 0; i != m_V.size(); ++i) - m_V[i] = 0x01; - - m_mac->set_key(std::vector<byte>(m_mac->output_length(), 0x00)); - - if(m_prng) - m_prng->clear(); - } - -std::string HMAC_DRBG::name() const - { - return "HMAC_DRBG(" + m_mac->name() + ")"; + // sqrt of hash size + return m_mac->output_length() * 8 / 2; } } diff --git a/src/lib/rng/hmac_drbg/hmac_drbg.h b/src/lib/rng/hmac_drbg/hmac_drbg.h index bd2d18d47..4f96af816 100644 --- a/src/lib/rng/hmac_drbg/hmac_drbg.h +++ b/src/lib/rng/hmac_drbg/hmac_drbg.h @@ -1,6 +1,6 @@ /* * HMAC_DRBG (SP800-90A) -* (C) 2014,2015 Jack Lloyd +* (C) 2014,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,46 +8,97 @@ #ifndef BOTAN_HMAC_DRBG_H__ #define BOTAN_HMAC_DRBG_H__ -#include <botan/rng.h> +#include <botan/stateful_rng.h> #include <botan/mac.h> namespace Botan { +class Entropy_Sources; + /** -* HMAC_DRBG (SP800-90A) +* HMAC_DRBG from NIST SP800-90A */ -class BOTAN_DLL HMAC_DRBG : public RandomNumberGenerator +class BOTAN_DLL HMAC_DRBG final : public Stateful_RNG { public: - void randomize(byte buf[], size_t buf_len) override; - bool is_seeded() const override; - void clear() override; - std::string name() const override; + /** + * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) + * + * Automatic reseeding is disabled completely, as it as 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. + */ + HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf); - size_t reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) override; + /** + * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) + * + * @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. + */ + HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - void add_entropy(const byte input[], size_t input_len) override; + /** + * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) + * + * @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. + */ + HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); /** - * @param mac the underlying mac function (eg HMAC(SHA-512)) - * @param underlying_rng RNG used generating inputs (eg HMAC_RNG) + * Initialize an HMAC_DRBG instance with the given MAC as PRF (normally HMAC) + * + * @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. */ - HMAC_DRBG(MessageAuthenticationCode* mac, - RandomNumberGenerator* underlying_rng = nullptr); + HMAC_DRBG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); - HMAC_DRBG(const std::string& mac, - RandomNumberGenerator* underlying_rng = nullptr); + /** + * Constructor taking a string for the hash + */ + HMAC_DRBG(const std::string& hmac_hash) : Stateful_RNG() + { + m_mac = MessageAuthenticationCode::create("HMAC(" + hmac_hash + ")"); + if(!m_mac) + throw Algorithm_Not_Found(hmac_hash); + clear(); + } + + std::string name() const override; + + void clear() override; + + void randomize(byte output[], size_t output_len) override; + + void randomize_with_input(byte output[], size_t output_len, + const byte input[], size_t input_len) override; + + void add_entropy(const byte input[], size_t input_len) override; + + size_t security_level() const override; private: void update(const byte input[], size_t input_len); std::unique_ptr<MessageAuthenticationCode> m_mac; - std::unique_ptr<RandomNumberGenerator> m_prng; - secure_vector<byte> m_V; - size_t m_reseed_counter; }; } diff --git a/src/lib/rng/hmac_drbg/info.txt b/src/lib/rng/hmac_drbg/info.txt index f386db199..7f2c12fd0 100644 --- a/src/lib/rng/hmac_drbg/info.txt +++ b/src/lib/rng/hmac_drbg/info.txt @@ -2,4 +2,5 @@ define HMAC_DRBG 20140319 <requires> hmac +stateful_rng </requires> diff --git a/src/lib/rng/hmac_rng/hmac_rng.cpp b/src/lib/rng/hmac_rng/hmac_rng.cpp index 7a9e4dbc5..081d8b38a 100644 --- a/src/lib/rng/hmac_rng/hmac_rng.cpp +++ b/src/lib/rng/hmac_rng/hmac_rng.cpp @@ -9,31 +9,80 @@ #include <botan/entropy_src.h> #include <botan/internal/os_utils.h> #include <algorithm> -#include <chrono> namespace Botan { -/* -* HMAC_RNG Constructor -*/ -HMAC_RNG::HMAC_RNG(MessageAuthenticationCode* extractor, - MessageAuthenticationCode* prf) : - m_extractor(extractor), m_prf(prf) +HMAC_RNG::HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + Entropy_Sources& entropy_sources, + size_t reseed_interval) : + Stateful_RNG(underlying_rng, entropy_sources, reseed_interval), + m_prf(std::move(prf)) + { + BOTAN_ASSERT_NONNULL(m_prf); + + if(!m_prf->valid_keylength(m_prf->output_length())) + { + throw Invalid_Argument("HMAC_RNG cannot use " + m_prf->name()); + } + + m_extractor.reset(m_prf->clone()); + this->clear(); + } + +HMAC_RNG::HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + size_t reseed_interval) : + Stateful_RNG(underlying_rng, reseed_interval), + m_prf(std::move(prf)) + { + BOTAN_ASSERT_NONNULL(m_prf); + + if(!m_prf->valid_keylength(m_prf->output_length())) + { + throw Invalid_Argument("HMAC_RNG cannot use " + m_prf->name()); + } + + m_extractor.reset(m_prf->clone()); + this->clear(); + } + +HMAC_RNG::HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + Entropy_Sources& entropy_sources, + size_t reseed_interval) : + Stateful_RNG(entropy_sources, reseed_interval), + m_prf(std::move(prf)), + m_extractor(m_prf->clone()) { - if(!m_prf->valid_keylength(m_extractor->output_length()) || - !m_extractor->valid_keylength(m_prf->output_length())) + BOTAN_ASSERT_NONNULL(m_prf); + + if(!m_prf->valid_keylength(m_prf->output_length())) { - throw Invalid_Argument("HMAC_RNG: Bad algo combination " + - m_extractor->name() + " and " + - m_prf->name()); + throw Invalid_Argument("HMAC_RNG cannot use " + m_prf->name()); } + m_extractor.reset(m_prf->clone()); + this->clear(); + } + +HMAC_RNG::HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf) : + Stateful_RNG(), + m_prf(std::move(prf)) + { + BOTAN_ASSERT_NONNULL(m_prf); + + if(!m_prf->valid_keylength(m_prf->output_length())) + { + throw Invalid_Argument("HMAC_RNG cannot use " + m_prf->name()); + } + + m_extractor.reset(m_prf->clone()); this->clear(); } void HMAC_RNG::clear() { - m_collected_entropy_estimate = 0; + Stateful_RNG::clear(); m_counter = 0; // First PRF inputs are all zero, as specified in section 2 @@ -71,7 +120,7 @@ void HMAC_RNG::clear() void HMAC_RNG::new_K_value(byte label) { m_prf->update(m_K); - m_prf->update_be(m_pid); + m_prf->update_be(last_pid()); m_prf->update_be(OS::get_processor_timestamp()); m_prf->update_be(OS::get_system_timestamp_ns()); m_prf->update_be(m_counter++); @@ -84,76 +133,38 @@ void HMAC_RNG::new_K_value(byte label) */ void HMAC_RNG::randomize(byte out[], size_t length) { - if(!is_seeded() || m_pid != OS::get_process_id()) - { - reseed(256); - if(!is_seeded()) - throw PRNG_Unseeded(name()); - } - - const size_t max_per_prf_iter = m_prf->output_length() / 2; + reseed_check(); - m_output_since_reseed += length; - - if(m_output_since_reseed >= BOTAN_RNG_MAX_OUTPUT_BEFORE_RESEED) - { - reseed_with_sources(Entropy_Sources::global_sources(), - BOTAN_RNG_RESEED_POLL_BITS, - BOTAN_RNG_AUTO_RESEED_TIMEOUT); - } - - /* - HMAC KDF as described in E-t-E, using a CTXinfo of "rng" - */ while(length) { new_K_value(Running); - const size_t copied = std::min<size_t>(length, max_per_prf_iter); + const size_t copied = std::min<size_t>(length, m_prf->output_length()); copy_mem(out, m_K.data(), copied); out += copied; length -= copied; } + + new_K_value(BlockFinished); } -size_t HMAC_RNG::reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds timeout) +size_t HMAC_RNG::reseed(Entropy_Sources& srcs, + size_t poll_bits, + std::chrono::milliseconds timeout) { + new_K_value(Reseed); + m_extractor->update(m_K); // m_K is the PRF output + /* - Using the terminology of E-t-E, XTR is the MAC function (normally - HMAC) seeded with XTS (below) and we form SKM, the key material, by - polling as many sources as we think needed to reach our polling - goal. We then also include feedback of the current PRK so that - a bad poll doesn't wipe us out. + * This ends up calling add_entropy which provides input to the extractor */ - - typedef std::chrono::system_clock clock; - auto deadline = clock::now() + timeout; - - double bits_collected = 0; - - Entropy_Accumulator accum([&](const byte in[], size_t in_len, double entropy_estimate) { - m_extractor->update(in, in_len); - bits_collected += entropy_estimate; - return (bits_collected >= poll_bits || clock::now() > deadline); - }); - - srcs.poll(accum); + size_t bits_collected = Stateful_RNG::reseed(srcs, poll_bits, timeout); /* - * It is necessary to feed forward poll data. Otherwise, a good poll - * (collecting a large amount of conditional entropy) followed by a - * bad one (collecting little) would be unsafe. Do this by - * generating new PRF outputs using the previous key and feeding - * them into the extractor function. + Now derive the new PRK using everything that has been fed into + the extractor, and set the PRF key to that */ - new_K_value(Reseed); - m_extractor->update(m_K); // K is the CTXinfo=reseed PRF output - - /* Now derive the new PRK using everything that has been fed into - the extractor, and set the PRF key to that */ m_prf->set_key(m_extractor->final()); // Now generate a new PRF output to use as the XTS extractor salt @@ -164,32 +175,17 @@ size_t HMAC_RNG::reseed_with_sources(Entropy_Sources& srcs, zeroise(m_K); m_counter = 0; - m_collected_entropy_estimate = - std::min<size_t>(m_collected_entropy_estimate + static_cast<size_t>(bits_collected), - m_extractor->output_length() * 8); - - m_output_since_reseed = 0; - m_pid = OS::get_process_id(); - - return static_cast<size_t>(bits_collected); - } - -bool HMAC_RNG::is_seeded() const - { - return (m_collected_entropy_estimate >= 256); + return bits_collected; } /* -* Add user-supplied entropy to the extractor input then reseed -* to incorporate it into the state +* Add user-supplied entropy to the extractor input then set remaining +* output length to for a reseed on next use. */ void HMAC_RNG::add_entropy(const byte input[], size_t length) { m_extractor->update(input, length); - - reseed_with_sources(Entropy_Sources::global_sources(), - BOTAN_RNG_RESEED_POLL_BITS, - BOTAN_RNG_RESEED_DEFAULT_TIMEOUT); + force_reseed(); } /* diff --git a/src/lib/rng/hmac_rng/hmac_rng.h b/src/lib/rng/hmac_rng/hmac_rng.h index 95ae25e39..d6e9b4896 100644 --- a/src/lib/rng/hmac_rng/hmac_rng.h +++ b/src/lib/rng/hmac_rng/hmac_rng.h @@ -1,6 +1,6 @@ /* * HMAC RNG -* (C) 2008,2013 Jack Lloyd +* (C) 2008,2013,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,9 +8,8 @@ #ifndef BOTAN_HMAC_RNG_H__ #define BOTAN_HMAC_RNG_H__ +#include <botan/stateful_rng.h> #include <botan/mac.h> -#include <botan/rng.h> -#include <vector> namespace Botan { @@ -19,48 +18,80 @@ namespace Botan { * Key Derivation Functions and an HMAC-based KDF" by Hugo Krawczyk * (henceforce, 'E-t-E') * -* However it actually can be parameterized with any two MAC functions, +* However it actually could be parameterized with any two MAC functions, * not restricted to HMAC (this variation is also described in * Krawczyk's paper), for instance one could use HMAC(SHA-512) as the * extractor and CMAC(AES-256) as the PRF. */ -class BOTAN_DLL HMAC_RNG : public RandomNumberGenerator +class BOTAN_DLL HMAC_RNG final : public Stateful_RNG { public: + /** + * Initialize an HMAC_RNG instance with the given MAC as PRF (normally HMAC) + * @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. + */ + HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); + + /** + * Initialize an HMAC_RNG instance with the given MAC as PRF (normally HMAC) + * @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. + */ + HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + RandomNumberGenerator& underlying_rng, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); + + /* + * Initialize an HMAC_RNG instance with the given MAC as PRF (normally HMAC) + * @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. + */ + HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf, + Entropy_Sources& entropy_sources, + size_t reseed_interval = BOTAN_RNG_DEFAULT_RESEED_INTERVAL); + + /** + * Initialize an HMAC_RNG instance with the given MAC as PRF (normally HMAC) + * Automatic reseeding is disabled completely. + */ + HMAC_RNG(std::unique_ptr<MessageAuthenticationCode> prf); + void randomize(byte buf[], size_t len) override; - bool is_seeded() const override; void clear() override; std::string name() const override; - size_t reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) override; + size_t reseed(Entropy_Sources& srcs, + size_t poll_bits, + std::chrono::milliseconds poll_timeout) override; void add_entropy(const byte[], size_t) override; - /** - * @param extractor a MAC used for extracting the entropy - * @param prf a MAC used as a PRF using HKDF construction - */ - HMAC_RNG(MessageAuthenticationCode* extractor, - MessageAuthenticationCode* prf); + size_t security_level() const override { return m_prf->output_length() * 8 / 2; } + private: - std::unique_ptr<MessageAuthenticationCode> m_extractor; std::unique_ptr<MessageAuthenticationCode> m_prf; + std::unique_ptr<MessageAuthenticationCode> m_extractor; enum HMAC_PRF_Label { Running, + BlockFinished, Reseed, ExtractorSeed, }; void new_K_value(byte label); - size_t m_collected_entropy_estimate = 0; - size_t m_output_since_reseed = 0; - secure_vector<byte> m_K; u32bit m_counter = 0; - u32bit m_pid = 0; }; } diff --git a/src/lib/rng/hmac_rng/info.txt b/src/lib/rng/hmac_rng/info.txt index 36a8a7a34..2b7f49c8a 100644 --- a/src/lib/rng/hmac_rng/info.txt +++ b/src/lib/rng/hmac_rng/info.txt @@ -2,4 +2,5 @@ define HMAC_RNG 20131128 <requires> mac +stateful_rng </requires> diff --git a/src/lib/rng/info.txt b/src/lib/rng/info.txt index ba7aa8e6a..655e35fd1 100644 --- a/src/lib/rng/info.txt +++ b/src/lib/rng/info.txt @@ -1,5 +1,4 @@ <requires> entropy -auto_rng -hmac_rng +hmac_drbg </requires> diff --git a/src/lib/rng/rdrand_rng/info.txt b/src/lib/rng/rdrand_rng/info.txt new file mode 100644 index 000000000..2e597ebec --- /dev/null +++ b/src/lib/rng/rdrand_rng/info.txt @@ -0,0 +1,16 @@ +define RDRAND_RNG 20160619 + +need_isa rdrand + +<arch> +x86_32 +x86_64 +</arch> + +<cc> +gcc +clang +icc +msvc +</cc> + diff --git a/src/lib/rng/rdrand_rng/rdrand_rng.cpp b/src/lib/rng/rdrand_rng/rdrand_rng.cpp new file mode 100644 index 000000000..4d2e51cf8 --- /dev/null +++ b/src/lib/rng/rdrand_rng/rdrand_rng.cpp @@ -0,0 +1,84 @@ +/** +* RDRAND RNG +* (C) 2016 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/rdrand_rng.h> +#include <botan/loadstor.h> +#include <botan/cpuid.h> + +#if !defined(BOTAN_USE_GCC_INLINE_ASM) + #include <immintrin.h> +#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() + { + bool ok = false; + uint32_t r = rdrand_status(ok); + + while(!ok) + { + r = rdrand_status(ok); + } + + return r; + } + +//static +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; + return r; + } + } + + return 0; + } + +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); + } + } + +} diff --git a/src/lib/rng/rdrand_rng/rdrand_rng.h b/src/lib/rng/rdrand_rng/rdrand_rng.h new file mode 100644 index 000000000..fcd54035b --- /dev/null +++ b/src/lib/rng/rdrand_rng/rdrand_rng.h @@ -0,0 +1,60 @@ +/** +* 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 <botan/rng.h> + +namespace Botan { + +class BOTAN_DLL RDRAND_RNG : 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 */ } + + 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; } + + void clear() override {} + }; + +} + +#endif diff --git a/src/lib/rng/rng.cpp b/src/lib/rng/rng.cpp index c17f23dd0..8c2982312 100644 --- a/src/lib/rng/rng.cpp +++ b/src/lib/rng/rng.cpp @@ -1,42 +1,62 @@ /* -* Random Number Generator -* (C) 1999-2008 Jack Lloyd +* (C) 2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ #include <botan/rng.h> -#include <botan/hmac_rng.h> -#include <botan/entropy_src.h> +#include <botan/loadstor.h> +#include <botan/internal/os_utils.h> + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif namespace Botan { -size_t RandomNumberGenerator::reseed(size_t bits_to_collect) +void RandomNumberGenerator::randomize_with_ts_input(byte output[], size_t output_len) { - return this->reseed_with_timeout(bits_to_collect, - BOTAN_RNG_RESEED_DEFAULT_TIMEOUT); + /* + Form additional input which is provided to the PRNG implementation + to paramaterize the KDF output. + */ + byte additional_input[16] = { 0 }; + store_le(OS::get_system_timestamp_ns(), additional_input); + store_le(OS::get_processor_timestamp(), additional_input + 8); + + randomize_with_input(output, output_len, additional_input, sizeof(additional_input)); } -size_t RandomNumberGenerator::reseed_with_timeout(size_t bits_to_collect, - std::chrono::milliseconds timeout) +void RandomNumberGenerator::randomize_with_input(byte output[], size_t output_len, + const byte input[], size_t input_len) { - return this->reseed_with_sources(Entropy_Sources::global_sources(), - bits_to_collect, - timeout); + this->add_entropy(input, input_len); + this->randomize(output, output_len); } -RandomNumberGenerator* RandomNumberGenerator::make_rng() +size_t RandomNumberGenerator::reseed(Entropy_Sources& srcs, + size_t poll_bits, + std::chrono::milliseconds poll_timeout) { - std::unique_ptr<MessageAuthenticationCode> h1(MessageAuthenticationCode::create("HMAC(SHA-512)")); - std::unique_ptr<MessageAuthenticationCode> h2(MessageAuthenticationCode::create("HMAC(SHA-512)")); - - if(!h1 || !h2) - throw Algorithm_Not_Found("HMAC_RNG HMACs"); - std::unique_ptr<RandomNumberGenerator> rng(new HMAC_RNG(h1.release(), h2.release())); + return srcs.poll(*this, poll_bits, poll_timeout); + } - rng->reseed(256); +void RandomNumberGenerator::reseed_from_rng(RandomNumberGenerator& rng, size_t poll_bits) + { + secure_vector<byte> buf(poll_bits / 8); + rng.randomize(buf.data(), buf.size()); + this->add_entropy(buf.data(), buf.size()); + } - return rng.release(); +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 } +Serialized_RNG::Serialized_RNG() : m_rng(RandomNumberGenerator::make_rng()) {} + } diff --git a/src/lib/rng/rng.h b/src/lib/rng/rng.h index 3fd3dcec8..d1cdcfff2 100644 --- a/src/lib/rng/rng.h +++ b/src/lib/rng/rng.h @@ -1,6 +1,6 @@ /* -* RandomNumberGenerator -* (C) 1999-2009 Jack Lloyd +* Random Number Generator base classes +* (C) 1999-2009,2015,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -8,6 +8,7 @@ #ifndef BOTAN_RANDOM_NUMBER_GENERATOR_H__ #define BOTAN_RANDOM_NUMBER_GENERATOR_H__ +#include <botan/entropy_src.h> #include <botan/secmem.h> #include <botan/exceptn.h> #include <chrono> @@ -19,16 +20,20 @@ namespace Botan { class Entropy_Sources; /** -* This class represents a random number (RNG) generator object. +* An interface to a cryptographic random number generator */ class BOTAN_DLL RandomNumberGenerator { public: - /** - * Create a seeded and active RNG object for general application use - * Added in 1.8.0 + virtual ~RandomNumberGenerator() = default; + + RandomNumberGenerator() = default; + + /* + * Never copy a RNG, create a new one */ - static RandomNumberGenerator* make_rng(); + RandomNumberGenerator(const RandomNumberGenerator& rng) = delete; + RandomNumberGenerator& operator=(const RandomNumberGenerator& rng) = delete; /** * Randomize a byte array. @@ -38,128 +43,160 @@ class BOTAN_DLL RandomNumberGenerator virtual void randomize(byte output[], size_t length) = 0; /** - * Return a random vector - * @param bytes number of bytes in the result - * @return randomized vector of length bytes - */ - virtual secure_vector<byte> random_vec(size_t bytes) - { - secure_vector<byte> output(bytes); - randomize(output.data(), output.size()); - return output; - } - - /** - * Only usable with POD types, only useful with integers - * get_random<u64bit>() + * 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 inputs a byte array containg the entropy to be added + * @param length the length of the byte array in */ - template<typename T> T get_random() - { - T r; - this->randomize(reinterpret_cast<byte*>(&r), sizeof(r)); - return r; - } + virtual void add_entropy(const byte input[], size_t length) = 0; /** - * Return a random byte - * @return random byte + * Incorporate some additional data into the RNG state. */ - byte next_byte() { return get_random<byte>(); } - - byte next_nonzero_byte() + template<typename T> void add_entropy_T(const T& t) { - byte b = next_byte(); - while(b == 0) - b = next_byte(); - return b; + this->add_entropy(reinterpret_cast<const uint8_t*>(&t), sizeof(T)); } /** - * Check whether this RNG is seeded. - * @return true if this RNG was already seeded, false otherwise. + * 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. */ - virtual bool is_seeded() const = 0; + virtual void randomize_with_input(byte output[], size_t output_len, + const byte input[], size_t input_len); /** - * Clear all internally held values of this RNG. + * This calls `randomize_with_input` using some timestamps as extra input. + * + * For a stateful RNG using non-random but potentially unique data as the + * additional_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 clear() = 0; + virtual void randomize_with_ts_input(byte output[], size_t output_len); /** - * Return the name of this object + * Return the name of this RNG type */ virtual std::string name() const = 0; /** - * Seed this RNG using the global entropy sources and default timeout - * @param bits_to_collect is the number of bits of entropy to - attempt to gather from the entropy sources + * Clear all internally held values of this RNG + * @post is_seeded() == false */ - size_t reseed(size_t bits_to_collect); + virtual void clear() = 0; /** - * Seed this RNG using the global entropy sources - * @param bits_to_collect is the number of bits of entropy to - attempt to gather from the entropy sources - * @param poll_timeout try not to run longer than this, no matter what + * Check whether this RNG is seeded. + * @return true if this RNG was already seeded, false otherwise. */ - size_t reseed_with_timeout(size_t bits_to_collect, - std::chrono::milliseconds poll_timeout); + 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_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) = 0; + 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); /** - * Add entropy to this RNG. - * @param in a byte array containg the entropy to be added - * @param length the length of the byte array in + * Reseed by reading specified bits from the RNG */ - virtual void add_entropy(const byte in[], size_t length) = 0; + virtual void reseed_from_rng(RandomNumberGenerator& rng, + size_t poll_bits = BOTAN_RNG_RESEED_POLL_BITS); - /* - * Never copy a RNG, create a new one + // 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 */ - RandomNumberGenerator(const RandomNumberGenerator& rng) = delete; - RandomNumberGenerator& operator=(const RandomNumberGenerator& rng) = delete; + secure_vector<byte> random_vec(size_t bytes) + { + secure_vector<byte> output(bytes); + this->randomize(output.data(), output.size()); + return output; + } + + /** + * Return a random byte + * @return random byte + */ + byte next_byte() + { + byte b; + this->randomize(&b, 1); + return b; + } + + byte next_nonzero_byte() + { + byte b = this->next_byte(); + while(b == 0) + b = this->next_byte(); + return b; + } - RandomNumberGenerator() {} - virtual ~RandomNumberGenerator() {} + /** + * 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 +*/ +class BOTAN_DLL Hardware_RNG : public RandomNumberGenerator + { + }; + +/** * Null/stub RNG - fails if you try to use it for anything +* This is not generally useful except for in certain tests */ -class BOTAN_DLL Null_RNG : public RandomNumberGenerator +class BOTAN_DLL Null_RNG final : public RandomNumberGenerator { public: - void randomize(byte[], size_t) override { throw PRNG_Unseeded("Null_RNG"); } + bool is_seeded() const override { return false; } void clear() override {} - std::string name() const override { return "Null_RNG"; } - - size_t reseed_with_sources(Entropy_Sources&, size_t, - std::chrono::milliseconds) override + void randomize(byte[], size_t) override { - return 0; + throw Exception("Null_RNG called"); } - bool is_seeded() const override { return false; } void add_entropy(const byte[], size_t) override {} + + std::string name() const override { return "Null_RNG"; } }; /** * Wraps access to a RNG in a mutex */ -class BOTAN_DLL Serialized_RNG : public RandomNumberGenerator +class BOTAN_DLL Serialized_RNG final : public RandomNumberGenerator { public: void randomize(byte out[], size_t len) override @@ -186,12 +223,12 @@ class BOTAN_DLL Serialized_RNG : public RandomNumberGenerator return m_rng->name(); } - size_t reseed_with_sources(Entropy_Sources& src, - size_t bits, - std::chrono::milliseconds msec) override + 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 { std::lock_guard<std::mutex> lock(m_mutex); - return m_rng->reseed_with_sources(src, bits, msec); + return m_rng->reseed(src, poll_bits, poll_timeout); } void add_entropy(const byte in[], size_t len) override @@ -200,7 +237,8 @@ class BOTAN_DLL Serialized_RNG : public RandomNumberGenerator m_rng->add_entropy(in, len); } - Serialized_RNG() : m_rng(RandomNumberGenerator::make_rng()) {} + BOTAN_DEPRECATED("Create an AutoSeeded_RNG for other constructor") Serialized_RNG(); + explicit Serialized_RNG(RandomNumberGenerator* rng) : m_rng(rng) {} private: mutable std::mutex m_mutex; diff --git a/src/lib/rng/stateful_rng/info.txt b/src/lib/rng/stateful_rng/info.txt new file mode 100644 index 000000000..b4dcedf4a --- /dev/null +++ b/src/lib/rng/stateful_rng/info.txt @@ -0,0 +1,2 @@ +define STATEFUL_RNG 20160819 + diff --git a/src/lib/rng/stateful_rng/stateful_rng.cpp b/src/lib/rng/stateful_rng/stateful_rng.cpp new file mode 100644 index 000000000..1349c1208 --- /dev/null +++ b/src/lib/rng/stateful_rng/stateful_rng.cpp @@ -0,0 +1,112 @@ +/* +* (C) 2016 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include <botan/stateful_rng.h> +#include <botan/internal/os_utils.h> +#include <botan/loadstor.h> + +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 byte input[], size_t len) + { + add_entropy(input, len); + + if(8*len >= security_level()) + { + m_reseed_counter = 1; + } + } + +void Stateful_RNG::randomize_with_ts_input(byte output[], size_t output_len) + { + byte additional_input[24] = { 0 }; + store_le(OS::get_system_timestamp_ns(), additional_input); + store_le(OS::get_processor_timestamp(), additional_input + 8); + store_le(m_last_pid, additional_input + 16); + store_le(static_cast<uint32_t>(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()) + { + m_reseed_counter = 1; + } + + 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()) + { + m_reseed_counter = 1; + } + } + +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; + } + } + +} diff --git a/src/lib/rng/stateful_rng/stateful_rng.h b/src/lib/rng/stateful_rng/stateful_rng.h new file mode 100644 index 000000000..11f0c7e3d --- /dev/null +++ b/src/lib/rng/stateful_rng/stateful_rng.h @@ -0,0 +1,118 @@ +/* +* (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 <botan/rng.h> + +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_DLL Stateful_RNG : public RandomNumberGenerator + { + public: + 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) + {} + + Stateful_RNG(RandomNumberGenerator& rng, size_t reseed_interval) : + m_underlying_rng(&rng), + m_reseed_interval(reseed_interval) + {} + + 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 byte 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(byte 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; + + void clear() override; + + protected: + /** + * Called with lock held + */ + void reseed_check(); + + uint32_t last_pid() const { return m_last_pid; } + + 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; + + /* + * Set to 1 after a sucessful 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; + uint32_t m_last_pid = 0; + }; + +} + +#endif diff --git a/src/lib/rng/system_rng/system_rng.cpp b/src/lib/rng/system_rng/system_rng.cpp index 81e235a8c..135f4fabd 100644 --- a/src/lib/rng/system_rng/system_rng.cpp +++ b/src/lib/rng/system_rng/system_rng.cpp @@ -28,32 +28,23 @@ namespace Botan { namespace { -class System_RNG_Impl : public RandomNumberGenerator +class System_RNG_Impl final : public RandomNumberGenerator { public: System_RNG_Impl(); ~System_RNG_Impl(); - void randomize(byte buf[], size_t len) override; - bool is_seeded() const override { return true; } + void clear() override {} - std::string name() const override { return "system"; } - size_t reseed_with_sources(Entropy_Sources&, - size_t /*poll_bits*/, - std::chrono::milliseconds /*timeout*/) override - { - // We ignore it and assert the PRNG is seeded. - // TODO: could poll and write it to /dev/urandom to help seed it - return 0; - } + void randomize(uint8_t out[], size_t len) override; - void add_entropy(const byte[], size_t) override - { - } - private: + void add_entropy(const uint8_t in[], size_t length) override; + + std::string name() const override; + private: #if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) HCRYPTPROV m_prov; #else @@ -61,6 +52,15 @@ class System_RNG_Impl : public RandomNumberGenerator #endif }; +std::string System_RNG_Impl::name() const + { +#if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) + return "cryptoapi"; +#else + return BOTAN_SYSTEM_RNG_DEVICE; +#endif + } + System_RNG_Impl::System_RNG_Impl() { #if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) @@ -74,7 +74,7 @@ System_RNG_Impl::System_RNG_Impl() #define O_NOCTTY 0 #endif - m_fd = ::open(BOTAN_SYSTEM_RNG_DEVICE, O_RDONLY | O_NOCTTY); + m_fd = ::open(BOTAN_SYSTEM_RNG_DEVICE, O_RDWR | O_NOCTTY); if(m_fd < 0) throw Exception("System_RNG failed to open RNG device"); #endif @@ -90,7 +90,61 @@ System_RNG_Impl::~System_RNG_Impl() #endif } -void System_RNG_Impl::randomize(byte buf[], size_t len) +void System_RNG_Impl::add_entropy(const uint8_t input[], size_t len) + { +#if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) + /* + There is no explicit ConsumeRandom, but all values provided in + the call are incorporated into the state. + + TODO: figure out a way to avoid this copy. Byte at a time updating + seems worse than the allocation. + + for(size_t i = 0; i != len; ++i) + { + uint8_t b = input[i]; + ::CryptGenRandom(m_prov, 1, &b); + } + */ + + if(len > 0) + { + secure_vector<uint8_t> buf(input, input + len); + ::CryptGenRandom(m_prov, static_cast<DWORD>(buf.size()), buf.data()); + } +#else + 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. + */ + if(errno == EPERM) + 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 + } + +void System_RNG_Impl::randomize(uint8_t buf[], size_t len) { #if defined(BOTAN_TARGET_OS_HAS_CRYPTGENRANDOM) ::CryptGenRandom(m_prov, static_cast<DWORD>(len), buf); diff --git a/src/lib/rng/system_rng/system_rng.h b/src/lib/rng/system_rng/system_rng.h index 6290b8769..9cf31e78b 100644 --- a/src/lib/rng/system_rng/system_rng.h +++ b/src/lib/rng/system_rng/system_rng.h @@ -22,29 +22,18 @@ BOTAN_DLL RandomNumberGenerator& system_rng(); /* * Instantiatable reference to the system RNG. */ -class BOTAN_DLL System_RNG : public RandomNumberGenerator +class BOTAN_DLL System_RNG final : public RandomNumberGenerator { public: - System_RNG() : m_rng(system_rng()) {} + std::string name() const override { return system_rng().name(); } - void randomize(Botan::byte out[], size_t len) override { m_rng.randomize(out, len); } + void randomize(uint8_t out[], size_t len) override { system_rng().randomize(out, len); } - bool is_seeded() const override { return m_rng.is_seeded(); } + void add_entropy(const uint8_t in[], size_t length) override { system_rng().add_entropy(in, length); } - void clear() override { m_rng.clear(); } + bool is_seeded() const override { return true; } - std::string name() const override { return m_rng.name(); } - - size_t reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) override - { - return m_rng.reseed_with_sources(srcs, poll_bits, poll_timeout); - } - - void add_entropy(const byte in[], size_t len) override { m_rng.add_entropy(in, len); } - private: - Botan::RandomNumberGenerator& m_rng; + void clear() override {} }; } diff --git a/src/lib/rng/x931_rng/info.txt b/src/lib/rng/x931_rng/info.txt index b61dc7ec9..4a4418083 100644 --- a/src/lib/rng/x931_rng/info.txt +++ b/src/lib/rng/x931_rng/info.txt @@ -1 +1,5 @@ define X931_RNG 20131128 + +<requires> +stateful_rng +</requires> diff --git a/src/lib/rng/x931_rng/x931_rng.cpp b/src/lib/rng/x931_rng/x931_rng.cpp index 020d9a5a5..ed44dc743 100644 --- a/src/lib/rng/x931_rng/x931_rng.cpp +++ b/src/lib/rng/x931_rng/x931_rng.cpp @@ -14,7 +14,7 @@ void ANSI_X931_RNG::randomize(byte out[], size_t length) { if(!is_seeded()) { - reseed(BOTAN_RNG_RESEED_POLL_BITS); + rekey(); if(!is_seeded()) throw PRNG_Unseeded(name()); @@ -72,11 +72,11 @@ void ANSI_X931_RNG::rekey() } } -size_t ANSI_X931_RNG::reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) +size_t ANSI_X931_RNG::reseed(Entropy_Sources& srcs, + size_t poll_bits, + std::chrono::milliseconds poll_timeout) { - size_t bits = m_prng->reseed_with_sources(srcs, poll_bits, poll_timeout); + size_t bits = m_prng->reseed(srcs, poll_bits, poll_timeout); rekey(); return bits; } diff --git a/src/lib/rng/x931_rng/x931_rng.h b/src/lib/rng/x931_rng/x931_rng.h index ed7124a08..861fcffde 100644 --- a/src/lib/rng/x931_rng/x931_rng.h +++ b/src/lib/rng/x931_rng/x931_rng.h @@ -16,7 +16,7 @@ namespace Botan { /** * ANSI X9.31 RNG */ -class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator +class BOTAN_DLL ANSI_X931_RNG final : public RandomNumberGenerator { public: void randomize(byte[], size_t) override; @@ -24,9 +24,9 @@ class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator void clear() override; std::string name() const override; - size_t reseed_with_sources(Entropy_Sources& srcs, - size_t poll_bits, - std::chrono::milliseconds poll_timeout) override; + size_t reseed(Entropy_Sources& srcs, + size_t poll_bits, + std::chrono::milliseconds poll_timeout) override; void add_entropy(const byte[], size_t) override; @@ -35,6 +35,7 @@ class BOTAN_DLL ANSI_X931_RNG : public RandomNumberGenerator * @param rng the underlying PRNG for generating inputs * (eg, an HMAC_RNG) */ + BOTAN_DEPRECATED("X9.31 RNG is deprecated and will be removed soon") ANSI_X931_RNG(BlockCipher* cipher, RandomNumberGenerator* rng); diff --git a/src/lib/stream/chacha/chacha.cpp b/src/lib/stream/chacha/chacha.cpp index ac81fd70d..40da93029 100644 --- a/src/lib/stream/chacha/chacha.cpp +++ b/src/lib/stream/chacha/chacha.cpp @@ -12,8 +12,8 @@ namespace Botan { ChaCha::ChaCha(size_t rounds) : m_rounds(rounds) { - if(m_rounds != 12 && m_rounds != 20) - throw Invalid_Argument("ChaCha only supports 12 or 20 rounds"); + if(m_rounds != 8 && m_rounds != 12 && m_rounds != 20) + throw Invalid_Argument("ChaCha only supports 8, 12 or 20 rounds"); } namespace { @@ -67,7 +67,6 @@ void chacha(byte output[64], const u32bit input[16], size_t rounds) store_le(x14 + input[14], output + 4 * 14); store_le(x15 + input[15], output + 4 * 15); } - } /* @@ -173,4 +172,27 @@ std::string ChaCha::name() const return "ChaCha(" + std::to_string(m_rounds) + ")"; } +void ChaCha::seek(u64bit offset) + { + if (m_state.size() == 0 && m_buffer.size() == 0) + { + throw Invalid_State("You have to setup the stream cipher (key and iv)"); + } + + m_position = offset % m_buffer.size(); + + u64bit counter = offset / m_buffer.size(); + + byte out[8]; + + store_le(counter, out); + + m_state[12] = load_le<u32bit>(out, 0); + m_state[13] += load_le<u32bit>(out, 1); + + chacha(m_buffer.data(), m_state.data(), m_rounds); + + ++m_state[12]; + m_state[13] += (m_state[12] == 0); + } } diff --git a/src/lib/stream/chacha/chacha.h b/src/lib/stream/chacha/chacha.h index ba93d6260..f8f42e41d 100644 --- a/src/lib/stream/chacha/chacha.h +++ b/src/lib/stream/chacha/chacha.h @@ -21,7 +21,7 @@ class BOTAN_DLL ChaCha final : public StreamCipher StreamCipher* clone() const override { return new ChaCha(m_rounds); } /** - * Currently only 12 or 20 rounds are supported, all others + * Currently only 8, 12 or 20 rounds are supported, all others * will throw an exception */ ChaCha(size_t rounds); @@ -42,6 +42,8 @@ class BOTAN_DLL ChaCha final : public StreamCipher std::string name() const override; + void seek(u64bit offset) override; + private: void key_schedule(const byte key[], size_t key_len) override; diff --git a/src/lib/stream/ctr/ctr.cpp b/src/lib/stream/ctr/ctr.cpp index 88c7a8d8e..43609ba2d 100644 --- a/src/lib/stream/ctr/ctr.cpp +++ b/src/lib/stream/ctr/ctr.cpp @@ -23,10 +23,23 @@ CTR_BE::CTR_BE(BlockCipher* ciph) : m_cipher(ciph), m_counter(m_cipher->parallel_bytes()), m_pad(m_counter.size()), + m_ctr_size(m_cipher->block_size()), m_pad_pos(0) { } +CTR_BE::CTR_BE(BlockCipher* cipher, size_t ctr_size) : + m_cipher(cipher), + m_counter(m_cipher->parallel_bytes()), + m_pad(m_counter.size()), + m_ctr_size(ctr_size), + m_pad_pos(0) + { + //BOTAN_CHECK_ARG(m_ctr_size > 0 && m_ctr_size <= cipher->block_size(), "Invalid CTR size"); + if(m_ctr_size == 0 || m_ctr_size > m_cipher->block_size()) + throw Invalid_Argument("Invalid CTR-BE counter size"); + } + void CTR_BE::clear() { m_cipher->clear(); @@ -79,7 +92,7 @@ void CTR_BE::set_iv(const byte iv[], size_t iv_len) { buffer_insert(m_counter, i*bs, &m_counter[(i-1)*bs], bs); - for(size_t j = 0; j != bs; ++j) + for(size_t j = 0; j != m_ctr_size; ++j) if(++m_counter[i*bs + (bs - 1 - j)]) break; } @@ -99,7 +112,7 @@ void CTR_BE::increment_counter() for(size_t i = 0; i != n_wide; ++i) { uint16_t carry = static_cast<uint16_t>(n_wide); - for(size_t j = 0; carry && j != bs; ++j) + for(size_t j = 0; carry && j != m_ctr_size; ++j) { const size_t off = i*bs + (bs-1-j); const uint16_t cnt = static_cast<uint16_t>(m_counter[off]) + carry; @@ -112,4 +125,8 @@ void CTR_BE::increment_counter() m_pad_pos = 0; } +void CTR_BE::seek(u64bit) + { + throw Not_Implemented("CTR_BE::seek"); + } } diff --git a/src/lib/stream/ctr/ctr.h b/src/lib/stream/ctr/ctr.h index 8e931605c..5d5556254 100644 --- a/src/lib/stream/ctr/ctr.h +++ b/src/lib/stream/ctr/ctr.h @@ -44,12 +44,17 @@ class BOTAN_DLL CTR_BE final : public StreamCipher * @param cipher the underlying block cipher to use */ explicit CTR_BE(BlockCipher* cipher); + + CTR_BE(BlockCipher* cipher, size_t ctr_size); + + void seek(u64bit offset) override; private: void key_schedule(const byte key[], size_t key_len) override; void increment_counter(); std::unique_ptr<BlockCipher> m_cipher; secure_vector<byte> m_counter, m_pad; + size_t m_ctr_size; size_t m_pad_pos; }; diff --git a/src/lib/stream/ofb/ofb.cpp b/src/lib/stream/ofb/ofb.cpp index e8cb463db..3337a0c14 100644 --- a/src/lib/stream/ofb/ofb.cpp +++ b/src/lib/stream/ofb/ofb.cpp @@ -73,4 +73,9 @@ void OFB::set_iv(const byte iv[], size_t iv_len) m_buf_pos = 0; } + +void OFB::seek(u64bit) + { + throw Exception("OFB does not support seeking"); + } } diff --git a/src/lib/stream/ofb/ofb.h b/src/lib/stream/ofb/ofb.h index fecd47d9d..127a06578 100644 --- a/src/lib/stream/ofb/ofb.h +++ b/src/lib/stream/ofb/ofb.h @@ -44,6 +44,8 @@ class BOTAN_DLL OFB final : public StreamCipher * @param cipher the underlying block cipher to use */ explicit OFB(BlockCipher* cipher); + + void seek(u64bit offset) override; private: void key_schedule(const byte key[], size_t key_len) override; diff --git a/src/lib/stream/rc4/rc4.cpp b/src/lib/stream/rc4/rc4.cpp index 895f38091..e5ea2e2b8 100644 --- a/src/lib/stream/rc4/rc4.cpp +++ b/src/lib/stream/rc4/rc4.cpp @@ -6,6 +6,7 @@ */ #include <botan/rc4.h> +#include <botan/exceptn.h> namespace Botan { @@ -35,6 +36,11 @@ void RC4::cipher(const byte in[], byte out[], size_t length) m_position += length; } +void RC4::set_iv(const byte*, size_t) + { + throw Exception("RC4 does not support an IV"); + } + /* * Generate cipher stream */ @@ -113,4 +119,8 @@ void RC4::clear() */ RC4::RC4(size_t s) : m_SKIP(s) {} +void RC4::seek(u64bit) + { + throw Exception("RC4 does not support seeking"); + } } diff --git a/src/lib/stream/rc4/rc4.h b/src/lib/stream/rc4/rc4.h index f166a2772..82dd6097b 100644 --- a/src/lib/stream/rc4/rc4.h +++ b/src/lib/stream/rc4/rc4.h @@ -21,6 +21,8 @@ class BOTAN_DLL RC4 final : public StreamCipher public: void cipher(const byte in[], byte out[], size_t length) override; + void set_iv(const byte iv[], size_t iv_len) override; + void clear() override; std::string name() const override; @@ -39,6 +41,8 @@ class BOTAN_DLL RC4 final : public StreamCipher explicit RC4(size_t skip = 0); ~RC4() { clear(); } + + void seek(u64bit offset) override; private: void key_schedule(const byte[], size_t) override; void generate(); diff --git a/src/lib/stream/salsa20/salsa20.cpp b/src/lib/stream/salsa20/salsa20.cpp index 1d3fe3d28..f11fe5e59 100644 --- a/src/lib/stream/salsa20/salsa20.cpp +++ b/src/lib/stream/salsa20/salsa20.cpp @@ -227,4 +227,8 @@ void Salsa20::clear() m_position = 0; } +void Salsa20::seek(u64bit) + { + throw Not_Implemented("Salsa20::seek"); + } } diff --git a/src/lib/stream/salsa20/salsa20.h b/src/lib/stream/salsa20/salsa20.h index 7e75470da..8256ea4db 100644 --- a/src/lib/stream/salsa20/salsa20.h +++ b/src/lib/stream/salsa20/salsa20.h @@ -33,6 +33,8 @@ class BOTAN_DLL Salsa20 final : public StreamCipher void clear() override; std::string name() const override; StreamCipher* clone() const override { return new Salsa20; } + + void seek(u64bit offset) override; private: void key_schedule(const byte key[], size_t key_len) override; diff --git a/src/lib/stream/stream_cipher.cpp b/src/lib/stream/stream_cipher.cpp index 6f98df1fb..cd6400d8f 100644 --- a/src/lib/stream/stream_cipher.cpp +++ b/src/lib/stream/stream_cipher.cpp @@ -44,12 +44,6 @@ std::vector<std::string> StreamCipher::providers(const std::string& algo_spec) StreamCipher::StreamCipher() {} StreamCipher::~StreamCipher() {} -void StreamCipher::set_iv(const byte[], size_t iv_len) - { - if(!valid_iv_length(iv_len)) - throw Invalid_IV_Length(name(), iv_len); - } - #if defined(BOTAN_HAS_CHACHA) BOTAN_REGISTER_T_1LEN(StreamCipher, ChaCha, 20); #endif diff --git a/src/lib/stream/stream_cipher.h b/src/lib/stream/stream_cipher.h index bff1fd1a6..e08bee0ce 100644 --- a/src/lib/stream/stream_cipher.h +++ b/src/lib/stream/stream_cipher.h @@ -67,7 +67,7 @@ class BOTAN_DLL StreamCipher : public SymmetricAlgorithm * @param iv the initialization vector * @param iv_len the length of the IV in bytes */ - virtual void set_iv(const byte[], size_t iv_len); + virtual void set_iv(const byte[], size_t iv_len) = 0; /** * @param iv_len the length of the IV in bytes @@ -80,6 +80,12 @@ class BOTAN_DLL StreamCipher : public SymmetricAlgorithm */ 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(u64bit offset) = 0; + StreamCipher(); virtual ~StreamCipher(); }; diff --git a/src/lib/tls/info.txt b/src/lib/tls/info.txt index a43d5619a..667726318 100644 --- a/src/lib/tls/info.txt +++ b/src/lib/tls/info.txt @@ -6,6 +6,7 @@ load_on auto credentials_manager.h tls_alert.h tls_blocking.h +tls_callbacks.h tls_channel.h tls_ciphersuite.h tls_client.h @@ -43,12 +44,12 @@ eme_pkcs1 emsa_pkcs1 gcm hmac -kdf2 md5 +par_hash prf_tls rng rsa -sha1 +sha1_sse2|sha1 sha2_32 x509 </requires> diff --git a/src/lib/tls/msg_client_hello.cpp b/src/lib/tls/msg_client_hello.cpp index d2b1a166e..51cba2940 100644 --- a/src/lib/tls/msg_client_hello.cpp +++ b/src/lib/tls/msg_client_hello.cpp @@ -1,6 +1,7 @@ /* * TLS Hello Request and Client Hello Messages * (C) 2004-2011,2015,2016 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -68,22 +69,20 @@ std::vector<byte> Hello_Request::serialize() const */ Client_Hello::Client_Hello(Handshake_IO& io, Handshake_Hash& hash, - Protocol_Version version, const Policy& policy, RandomNumberGenerator& rng, const std::vector<byte>& reneg_info, - const std::vector<std::string>& next_protocols, - const std::string& hostname, - const std::string& srp_identifier) : - m_version(version), + const Client_Hello::Settings& client_settings, + const std::vector<std::string>& next_protocols) : + m_version(client_settings.protocol_version()), m_random(make_hello_random(rng, policy)), - m_suites(policy.ciphersuite_list(m_version, (srp_identifier != ""))), + m_suites(policy.ciphersuite_list(m_version, + client_settings.srp_identifier() != "")), m_comp_methods(policy.compression()) { m_extensions.add(new Extended_Master_Secret); m_extensions.add(new Renegotiation_Extension(reneg_info)); - - m_extensions.add(new Server_Name_Indicator(hostname)); + m_extensions.add(new Server_Name_Indicator(client_settings.hostname())); m_extensions.add(new Session_Ticket()); m_extensions.add(new Supported_Elliptic_Curves(policy.allowed_ecc_curves())); @@ -101,7 +100,7 @@ Client_Hello::Client_Hello(Handshake_IO& io, m_extensions.add(new Encrypt_then_MAC); #if defined(BOTAN_HAS_SRP6) - m_extensions.add(new SRP_Identifier(srp_identifier)); + m_extensions.add(new SRP_Identifier(client_settings.srp_identifier())); #else if(!srp_identifier.empty()) { @@ -109,10 +108,10 @@ Client_Hello::Client_Hello(Handshake_IO& io, } #endif - BOTAN_ASSERT(policy.acceptable_protocol_version(version), + BOTAN_ASSERT(policy.acceptable_protocol_version(client_settings.protocol_version()), "Our policy accepts the version we are offering"); - if(policy.send_fallback_scsv(version)) + if(policy.send_fallback_scsv(client_settings.protocol_version())) m_suites.push_back(TLS_FALLBACK_SCSV); hash.update(io.send(*this)); diff --git a/src/lib/tls/msg_finished.cpp b/src/lib/tls/msg_finished.cpp index 2d6b11995..3a2c88fb1 100644 --- a/src/lib/tls/msg_finished.cpp +++ b/src/lib/tls/msg_finished.cpp @@ -31,14 +31,15 @@ std::vector<byte> finished_compute_verify(const Handshake_State& state, std::unique_ptr<KDF> prf(state.protocol_specific_prf()); std::vector<byte> input; + std::vector<byte> label; if(side == CLIENT) - input += std::make_pair(TLS_CLIENT_LABEL, sizeof(TLS_CLIENT_LABEL)); + label += std::make_pair(TLS_CLIENT_LABEL, sizeof(TLS_CLIENT_LABEL)); else - input += std::make_pair(TLS_SERVER_LABEL, sizeof(TLS_SERVER_LABEL)); + 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)); + return unlock(prf->derive_key(12, state.session_keys().master_secret(), input, label)); } } diff --git a/src/lib/tls/msg_server_hello.cpp b/src/lib/tls/msg_server_hello.cpp index e309a7c91..ebe8fb085 100644 --- a/src/lib/tls/msg_server_hello.cpp +++ b/src/lib/tls/msg_server_hello.cpp @@ -1,6 +1,7 @@ /* * TLS Server Hello and Server Hello Done * (C) 2004-2011,2015,2016 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -23,17 +24,13 @@ Server_Hello::Server_Hello(Handshake_IO& io, RandomNumberGenerator& rng, const std::vector<byte>& reneg_info, const Client_Hello& client_hello, - const std::vector<byte>& new_session_id, - Protocol_Version new_session_version, - u16bit ciphersuite, - byte compression, - bool offer_session_ticket, - const std::string& next_protocol) : - m_version(new_session_version), - m_session_id(new_session_id), + 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(ciphersuite), - m_comp_method(compression) + 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); @@ -48,7 +45,7 @@ Server_Hello::Server_Hello(Handshake_IO& io, if(client_hello.secure_renegotiation()) m_extensions.add(new Renegotiation_Extension(reneg_info)); - if(client_hello.supports_session_ticket() && offer_session_ticket) + 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()) diff --git a/src/lib/tls/tls_blocking.cpp b/src/lib/tls/tls_blocking.cpp index a1867b6b5..9408972fd 100644 --- a/src/lib/tls/tls_blocking.cpp +++ b/src/lib/tls/tls_blocking.cpp @@ -1,6 +1,7 @@ /* * TLS Blocking API * (C) 2013 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -23,10 +24,13 @@ Blocking_Client::Blocking_Client(read_fn reader, const Protocol_Version& offer_version, const std::vector<std::string>& next) : m_read(reader), - m_channel(writer, - std::bind(&Blocking_Client::data_cb, this, _1, _2), - std::bind(&Blocking_Client::alert_cb, this, _1, _2, _3), - std::bind(&Blocking_Client::handshake_cb, this, _1), + m_callbacks(new TLS::Compat_Callbacks( + writer, + std::bind(&Blocking_Client::data_cb, this, _1, _2), + std::function<void (Alert)>(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, @@ -42,7 +46,7 @@ bool Blocking_Client::handshake_cb(const Session& session) return this->handshake_complete(session); } -void Blocking_Client::alert_cb(const Alert& alert, const byte[], size_t) +void Blocking_Client::alert_cb(const Alert& alert) { this->alert_notification(alert); } diff --git a/src/lib/tls/tls_blocking.h b/src/lib/tls/tls_blocking.h index 00e65cbaf..0f2986710 100644 --- a/src/lib/tls/tls_blocking.h +++ b/src/lib/tls/tls_blocking.h @@ -1,6 +1,7 @@ /* * TLS Blocking API * (C) 2013 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -32,6 +33,7 @@ class BOTAN_DLL Blocking_Client typedef std::function<size_t (byte[], size_t)> read_fn; typedef std::function<void (const byte[], size_t)> write_fn; + BOTAN_DEPRECATED("Use the regular TLS::Client interface") Blocking_Client(read_fn reader, write_fn writer, Session_Manager& session_manager, @@ -89,9 +91,10 @@ class BOTAN_DLL Blocking_Client void data_cb(const byte data[], size_t data_len); - void alert_cb(const Alert& alert, const byte data[], size_t data_len); + void alert_cb(const Alert& alert); read_fn m_read; + std::unique_ptr<Compat_Callbacks> m_callbacks; TLS::Client m_channel; secure_vector<byte> m_plaintext; }; diff --git a/src/lib/tls/tls_callbacks.h b/src/lib/tls/tls_callbacks.h new file mode 100644 index 000000000..75887c23f --- /dev/null +++ b/src/lib/tls/tls_callbacks.h @@ -0,0 +1,203 @@ +/* +* TLS Callbacks +* (C) 2016 Matthias Gierlings +* 2016 Jack Lloyd +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#ifndef BOTAN_TLS_CALLBACKS_H__ +#define BOTAN_TLS_CALLBACKS_H__ + +#include <botan/tls_session.h> +#include <botan/tls_alert.h> +namespace Botan { + +namespace TLS { + +class Handshake_Message; + +/** +* Encapsulates the callbacks that a TLS channel will make which are due to +* channel specific operations. +*/ +class BOTAN_DLL Callbacks + { + public: + virtual ~Callbacks(); + + /** + * 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(u64bit seq_no, const uint8_t data[], size_t size) = 0; + + /** + * Mandary 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: 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<std::string>& client_protos); + + /** + * Optional callback: debug logging. (not currently used) + */ + virtual bool tls_log_debug(const char*) { return false; } + }; + +/** +* 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_DLL Compat_Callbacks final : public Callbacks + { + public: + typedef std::function<void (const byte[], size_t)> output_fn; + typedef std::function<void (const byte[], size_t)> data_cb; + typedef std::function<void (Alert, const byte[], size_t)> alert_cb; + typedef std::function<bool (const Session&)> handshake_cb; + typedef std::function<void (const Handshake_Message&)> handshake_msg_cb; + typedef std::function<std::string (std::vector<std::string>)> 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 handshake_cb is called when a handshake is completed + */ + BOTAN_DEPRECATED("Use TLS::Callbacks (virtual interface).") + Compat_Callbacks(output_fn out, 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(out), 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 out, data_cb app_data_cb, + std::function<void (Alert)> alert_cb, + handshake_cb hs_cb, + handshake_msg_cb hs_msg_cb = nullptr, + next_protocol_fn next_proto = nullptr) + : m_output_function(out), 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) {} + + void tls_emit_data(const byte 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(u64bit /*seq_no*/, const byte 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<std::string>& 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<void (Alert)> 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 diff --git a/src/lib/tls/tls_channel.cpp b/src/lib/tls/tls_channel.cpp index 4549470e2..5e9207da7 100644 --- a/src/lib/tls/tls_channel.cpp +++ b/src/lib/tls/tls_channel.cpp @@ -1,6 +1,7 @@ /* * TLS Channels -* (C) 2011,2012,2014,2015 Jack Lloyd +* (C) 2011,2012,2014,2015,2016 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -18,32 +19,63 @@ namespace Botan { namespace TLS { -Channel::Channel(output_fn output_fn, - data_cb data_cb, - alert_cb alert_cb, - handshake_cb handshake_cb, - handshake_msg_cb handshake_msg_cb, +Callbacks::~Callbacks() {} + +void Callbacks::tls_inspect_handshake_msg(const Handshake_Message&) + { + // default is no op + } + +std::string Callbacks::tls_server_choose_app_protocol(const std::vector<std::string>&) + { + return ""; + } + +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_data_cb(data_cb), - m_alert_cb(alert_cb), - m_output_fn(output_fn), - m_handshake_cb(handshake_cb), - m_handshake_msg_cb(handshake_msg_cb), + 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(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(reserved_io_buffer_size); - m_readbuf.reserve(reserved_io_buffer_size); + m_writebuf.reserve(io_buf_sz); + m_readbuf.reserve(io_buf_sz); } void Channel::reset_state() @@ -265,23 +297,19 @@ size_t Channel::received_data(const byte input[], size_t input_size) { while(!is_closed() && input_size) { - secure_vector<byte> record; + secure_vector<byte> record_data; u64bit 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, - input, - input_size, - m_is_datagram, - consumed, + raw_input, record, - &record_sequence, - &record_version, - &record_type, m_sequence_numbers.get(), std::bind(&TLS::Channel::read_cipher_state_epoch, this, std::placeholders::_1)); @@ -300,105 +328,21 @@ size_t Channel::received_data(const byte input[], size_t input_size) if(input_size == 0 && needed != 0) return needed; // need more data to complete record - if(record.size() > MAX_PLAINTEXT_SIZE) + 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) { - 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 u16bit 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); - } - } + process_handshake_ccs(record_data, record_sequence, record_type, record_version); } else if(record_type == APPLICATION_DATA) { - 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) - m_data_cb(record.data(), record.size()); + process_application_data(record_sequence, record_data); } else if(record_type == ALERT) { - Alert alert_msg(record); - - if(alert_msg.type() == Alert::NO_RENEGOTIATION) - m_pending_state.reset(); - - m_alert_cb(alert_msg, nullptr, 0); - - 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(); - return 0; - } + process_alert(record_data); } else if(record_type != NO_RECORD) throw Unexpected_Message("Unexpected record type " + @@ -430,6 +374,108 @@ size_t Channel::received_data(const byte input[], size_t input_size) } } +void Channel::process_handshake_ccs(const secure_vector<byte>& record, + u64bit 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 u16bit 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(u64bit seq_no, const secure_vector<byte>& 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<byte>& 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, u16bit epoch, byte record_type, const byte input[], size_t length) { @@ -438,16 +484,16 @@ void Channel::write_record(Connection_Cipher_State* cipher_state, u16bit epoch, 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_type, - input, - length, + record_message, record_version, sequence_numbers().next_write_sequence(epoch), cipher_state, m_rng); - m_output_fn(m_writebuf.data(), m_writebuf.size()); + callbacks().tls_emit_data(m_writebuf.data(), m_writebuf.size()); } void Channel::send_record_array(u16bit epoch, byte type, const byte input[], size_t length) @@ -623,7 +669,6 @@ SymmetricKey Channel::key_material_export(const std::string& label, active->session_keys().master_secret(); std::vector<byte> salt; - salt += to_byte_vector(label); salt += active->client_hello()->random(); salt += active->server_hello()->random(); @@ -637,7 +682,7 @@ SymmetricKey Channel::key_material_export(const std::string& label, salt += to_byte_vector(context); } - return prf->derive_key(length, master_secret, salt); + return prf->derive_key(length, master_secret, salt, to_byte_vector(label)); } else throw Exception("Channel::key_material_export connection not active"); diff --git a/src/lib/tls/tls_channel.h b/src/lib/tls/tls_channel.h index e0219c242..073af760f 100644 --- a/src/lib/tls/tls_channel.h +++ b/src/lib/tls/tls_channel.h @@ -1,6 +1,7 @@ /* * TLS Channel * (C) 2011,2012,2014,2015 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -12,6 +13,7 @@ #include <botan/tls_session.h> #include <botan/tls_alert.h> #include <botan/tls_session_manager.h> +#include <botan/tls_callbacks.h> #include <botan/x509cert.h> #include <vector> #include <string> @@ -37,7 +39,20 @@ class BOTAN_DLL Channel typedef std::function<void (Alert, const byte[], size_t)> alert_cb; typedef std::function<bool (const Session&)> handshake_cb; typedef std::function<void (const Handshake_Message&)> handshake_msg_cb; + static size_t IO_BUF_DEFAULT_SIZE; + 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. + */ + BOTAN_DEPRECATED("Use TLS::Channel(TLS::Callbacks ...)") Channel(output_fn out, data_cb app_data_cb, alert_cb alert_cb, @@ -47,7 +62,7 @@ class BOTAN_DLL Channel RandomNumberGenerator& rng, const Policy& policy, bool is_datagram, - size_t io_buf_sz = 16*1024); + size_t io_buf_sz = IO_BUF_DEFAULT_SIZE); Channel(const Channel&) = delete; @@ -200,10 +215,12 @@ class BOTAN_DLL Channel const Policy& policy() const { return m_policy; } - bool save_session(const Session& session) const { return m_handshake_cb(session); } + bool save_session(const Session& session) const { return callbacks().tls_session_established(session); } - handshake_msg_cb get_handshake_msg_cb() const { return m_handshake_msg_cb; } + Callbacks& callbacks() const { return m_callbacks; } private: + void init(size_t io_buf_sze); + void send_record(byte record_type, const std::vector<byte>& record); void send_record_under_epoch(u16bit epoch, byte record_type, @@ -227,14 +244,21 @@ class BOTAN_DLL Channel 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<byte>& record, + u64bit record_sequence, + Record_Type record_type, + Protocol_Version record_version); + + void process_application_data(u64bit req_no, const secure_vector<byte>& record); + + void process_alert(const secure_vector<byte>& record); + bool m_is_datagram; /* callbacks */ - data_cb m_data_cb; - alert_cb m_alert_cb; - output_fn m_output_fn; - handshake_cb m_handshake_cb; - handshake_msg_cb m_handshake_msg_cb; + std::unique_ptr<Compat_Callbacks> m_compat_callbacks; + Callbacks& m_callbacks; /* external state */ Session_Manager& m_session_manager; diff --git a/src/lib/tls/tls_ciphersuite.cpp b/src/lib/tls/tls_ciphersuite.cpp index 0b575a6ca..9a52e0e0e 100644 --- a/src/lib/tls/tls_ciphersuite.cpp +++ b/src/lib/tls/tls_ciphersuite.cpp @@ -11,83 +11,18 @@ #include <botan/stream_cipher.h> #include <botan/hash.h> #include <botan/mac.h> -#include <sstream> +#include <algorithm> namespace Botan { namespace TLS { -namespace { - -/* -* This way all work happens at the constuctor call, and we can -* rely on that happening only once in C++11. -*/ -std::vector<Ciphersuite> gather_known_ciphersuites() - { - std::vector<Ciphersuite> ciphersuites; - - std::vector<u16bit> all_ids = Ciphersuite::all_known_ciphersuite_ids(); - - for(auto id : all_ids) - { - Ciphersuite suite = Ciphersuite::by_id(id); - - if(suite.valid()) - ciphersuites.push_back(suite); - } - - return ciphersuites; - } - -} - -const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites() - { - static std::vector<Ciphersuite> all_ciphersuites(gather_known_ciphersuites()); - return all_ciphersuites; - } - -Ciphersuite Ciphersuite::by_name(const std::string& name) - { - for(auto suite : all_known_ciphersuites()) - { - if(suite.to_string() == name) - return suite; - } - - return Ciphersuite(); // some unknown ciphersuite - } - bool Ciphersuite::is_scsv(u16bit suite) { // TODO: derive from IANA file in script return (suite == 0x00FF || suite == 0x5600); } -Ciphersuite::Ciphersuite(u16bit ciphersuite_code, - 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_sig_algo(sig_algo), - m_kex_algo(kex_algo), - m_prf_algo(prf_algo), - m_cipher_algo(cipher_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_algo(mac_algo), - m_mac_keylen(mac_keylen) - { - } - bool Ciphersuite::psk_ciphersuite() const { return (kex_algo() == "PSK" || @@ -107,6 +42,19 @@ bool Ciphersuite::cbc_ciphersuite() const cipher_algo() == "Camellia-128" || cipher_algo() == "Camellia-256"); } +Ciphersuite Ciphersuite::by_id(u16bit suite) + { + const std::vector<Ciphersuite>& all_suites = all_known_ciphersuites(); + auto s = std::lower_bound(all_suites.begin(), all_suites.end(), suite); + + if(s->ciphersuite_code() == suite) + { + return *s; + } + + return Ciphersuite(); // some unknown ciphersuite + } + namespace { bool have_hash(const std::string& prf) @@ -122,7 +70,7 @@ bool have_cipher(const std::string& cipher) } -bool Ciphersuite::valid() const +bool Ciphersuite::is_usable() const { if(!m_cipher_keylen) // uninitialized object return false; @@ -213,73 +161,6 @@ bool Ciphersuite::valid() const return true; } -std::string Ciphersuite::to_string() const - { - if(m_cipher_keylen == 0) - throw Exception("Ciphersuite::to_string - no value set"); - - std::ostringstream out; - - out << "TLS_"; - - if(kex_algo() != "RSA") - { - if(kex_algo() == "DH") - out << "DHE"; - else if(kex_algo() == "ECDH") - out << "ECDHE"; - else - out << kex_algo(); - - out << '_'; - } - - if(sig_algo() == "DSA") - out << "DSS_"; - else if(sig_algo() != "") - out << sig_algo() << '_'; - - out << "WITH_"; - - if(cipher_algo() == "RC4") - { - out << "RC4_128_"; - } - else if(cipher_algo() == "ChaCha20Poly1305") - { - out << "CHACHA20_POLY1305_"; - } - else - { - if(cipher_algo() == "3DES") - out << "3DES_EDE"; - else if(cipher_algo().find("Camellia") == 0) - out << "CAMELLIA_" << std::to_string(8*cipher_keylen()); - else - { - if(cipher_algo().find("OCB(12)") != std::string::npos) - out << replace_chars(cipher_algo().substr(0, cipher_algo().size() - 4), - {'-', '/'}, '_'); - else - out << replace_chars(cipher_algo(), {'-', '/'}, '_'); - } - - if(cipher_algo().find("/") != std::string::npos) - out << "_"; // some explicit mode already included - else - out << "_CBC_"; - } - - if(mac_algo() == "SHA-1") - out << "SHA"; - else if(mac_algo() == "AEAD") - out << erase_chars(prf_algo(), {'-'}); - else - out << erase_chars(mac_algo(), {'-'}); - - return out.str(); - } - } } diff --git a/src/lib/tls/tls_ciphersuite.h b/src/lib/tls/tls_ciphersuite.h index 47246ec11..6708e3ca6 100644 --- a/src/lib/tls/tls_ciphersuite.h +++ b/src/lib/tls/tls_ciphersuite.h @@ -29,21 +29,12 @@ class BOTAN_DLL Ciphersuite */ static Ciphersuite by_id(u16bit suite); - static std::vector<u16bit> all_known_ciphersuite_ids(); - /** * Returns true iff this suite is a known SCSV */ static bool is_scsv(u16bit suite); /** - * Lookup a ciphersuite by name - * @param name the name (eg TLS_RSA_WITH_RC4_128_SHA) - * @return ciphersuite object - */ - static Ciphersuite by_name(const std::string& name); - - /** * Generate a static list of all known ciphersuites and return it. * * @return list of all known ciphersuites @@ -54,7 +45,7 @@ class BOTAN_DLL Ciphersuite * Formats the ciphersuite back to an RFC-style ciphersuite string * @return RFC ciphersuite string identifier */ - std::string to_string() const; + std::string to_string() const { return m_iana_id; } /** * @return ciphersuite number @@ -79,26 +70,28 @@ class BOTAN_DLL Ciphersuite /** * @return key exchange algorithm used by this ciphersuite */ - const std::string& kex_algo() const { return m_kex_algo; } + std::string kex_algo() const { return m_kex_algo; } /** * @return signature algorithm used by this ciphersuite */ - const std::string& sig_algo() const { return m_sig_algo; } + std::string sig_algo() const { return m_sig_algo; } /** * @return symmetric cipher algorithm used by this ciphersuite */ - const std::string& cipher_algo() const { return m_cipher_algo; } + std::string cipher_algo() const { return m_cipher_algo; } /** * @return message authentication algorithm used by this ciphersuite */ - const std::string& mac_algo() const { return m_mac_algo; } + std::string mac_algo() const { return m_mac_algo; } - const std::string& prf_algo() const + std::string prf_algo() const { - return (!m_prf_algo.empty()) ? m_prf_algo : m_mac_algo; + if(m_prf_algo && *m_prf_algo) + return m_prf_algo; + return m_mac_algo; } /** @@ -115,13 +108,19 @@ class BOTAN_DLL Ciphersuite /** * @return true if this is a valid/known ciphersuite */ - bool valid() const; + bool valid() const { return m_usable; } + + bool operator<(const Ciphersuite& o) const { return ciphersuite_code() < o.ciphersuite_code(); } + bool operator<(const u16bit c) const { return ciphersuite_code() < c; } Ciphersuite() {} private: + bool is_usable() const; + Ciphersuite(u16bit ciphersuite_code, + const char* iana_id, const char* sig_algo, const char* kex_algo, const char* cipher_algo, @@ -130,21 +129,43 @@ class BOTAN_DLL Ciphersuite size_t nonce_bytes_from_record, const char* mac_algo, size_t mac_keylen, - const char* prf_algo = ""); + 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(); + } u16bit m_ciphersuite_code = 0; - std::string m_sig_algo; - std::string m_kex_algo; - std::string m_prf_algo; + /* + All of these const char* strings are references to compile time + constants in tls_suite_info.cpp + */ + const char* m_iana_id; + + const char* m_sig_algo; + const char* m_kex_algo; + const char* m_prf_algo; + + const char* m_cipher_algo; + const char* m_mac_algo; - std::string m_cipher_algo; size_t m_cipher_keylen = 0; size_t m_nonce_bytes_from_handshake = 0; size_t m_nonce_bytes_from_record = 0; - - std::string m_mac_algo; size_t m_mac_keylen = 0; + + bool m_usable = false; }; } diff --git a/src/lib/tls/tls_client.cpp b/src/lib/tls/tls_client.cpp index bf7ccdf8c..0e72b9a28 100644 --- a/src/lib/tls/tls_client.cpp +++ b/src/lib/tls/tls_client.cpp @@ -1,6 +1,7 @@ /* * TLS Client * (C) 2004-2011,2012,2015,2016 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -23,7 +24,7 @@ class Client_Handshake_State : public Handshake_State public: // using Handshake_State::Handshake_State; - Client_Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : Handshake_State(io, cb) {} + Client_Handshake_State(Handshake_IO* io, Callbacks& cb) : Handshake_State(io, cb) {} const Public_Key& get_server_public_Key() const { @@ -42,6 +43,23 @@ class Client_Handshake_State : public Handshake_State /* * 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<std::string>& 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, @@ -59,10 +77,7 @@ Client::Client(output_fn output_fn, m_creds(creds), m_info(info) { - const std::string srp_identifier = m_creds.srp_identifier("tls-client", m_info.hostname()); - - Handshake_State& state = create_handshake_state(offer_version); - send_client_hello(state, false, offer_version, srp_identifier, next_protos); + init(offer_version, next_protos); } Client::Client(output_fn output_fn, @@ -82,15 +97,22 @@ Client::Client(output_fn output_fn, m_creds(creds), m_info(info) { + init(offer_version, next_protos); + } + +void Client::init(const Protocol_Version& protocol_version, + const std::vector<std::string>& next_protocols) + { const std::string srp_identifier = m_creds.srp_identifier("tls-client", m_info.hostname()); - Handshake_State& state = create_handshake_state(offer_version); - send_client_hello(state, false, offer_version, srp_identifier, next_protos); + 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, get_handshake_msg_cb()); + return new Client_Handshake_State(io, callbacks()); } std::vector<X509_Certificate> @@ -145,16 +167,15 @@ void Client::send_client_hello(Handshake_State& state_base, 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(), - version, policy(), rng(), secure_renegotiation_data_for_client_hello(), - next_protocols, - m_info.hostname(), - srp_identifier)); + client_settings, + next_protocols)); } secure_renegotiation_check(state.client_hello()); @@ -419,11 +440,9 @@ void Client::process_handshake_msg(const Handshake_State* active_state, "tls-client", m_info.hostname()); - state.client_certs( - new Certificate(state.handshake_io(), - state.hash(), - client_certs) - ); + state.client_certs(new Certificate(state.handshake_io(), + state.hash(), + client_certs)); } state.client_kex( diff --git a/src/lib/tls/tls_client.h b/src/lib/tls/tls_client.h index 45a741878..09af053af 100644 --- a/src/lib/tls/tls_client.h +++ b/src/lib/tls/tls_client.h @@ -1,6 +1,7 @@ /* * TLS Client * (C) 2004-2011 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -22,9 +23,49 @@ namespace TLS { class BOTAN_DLL 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<std::string>& 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 @@ -52,7 +93,7 @@ class BOTAN_DLL Client final : public Channel * 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 out, data_cb app_data_cb, alert_cb alert_cb, @@ -64,9 +105,14 @@ class BOTAN_DLL Client final : public Channel const Server_Information& server_info = Server_Information(), const Protocol_Version& offer_version = Protocol_Version::latest_tls_version(), const std::vector<std::string>& next_protocols = {}, - size_t reserved_io_buffer_size = 16*1024 + 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, @@ -83,6 +129,9 @@ class BOTAN_DLL Client final : public Channel const std::string& application_protocol() const { return m_application_protocol; } private: + void init(const Protocol_Version& protocol_version, + const std::vector<std::string>& next_protocols); + std::vector<X509_Certificate> get_peer_cert_chain(const Handshake_State& state) const override; diff --git a/src/lib/tls/tls_extensions.h b/src/lib/tls/tls_extensions.h index 28c49f084..dc69eec36 100644 --- a/src/lib/tls/tls_extensions.h +++ b/src/lib/tls/tls_extensions.h @@ -2,6 +2,7 @@ * 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) */ @@ -35,7 +36,6 @@ enum Handshake_Extension_Type { TLSEXT_SRP_IDENTIFIER = 12, TLSEXT_SIGNATURE_ALGORITHMS = 13, TLSEXT_USE_SRTP = 14, - TLSEXT_HEARTBEAT_SUPPORT = 15, TLSEXT_ALPN = 16, TLSEXT_ENCRYPT_THEN_MAC = 22, diff --git a/src/lib/tls/tls_handshake_hash.cpp b/src/lib/tls/tls_handshake_hash.cpp index 00b8d744c..4f78bebbc 100644 --- a/src/lib/tls/tls_handshake_hash.cpp +++ b/src/lib/tls/tls_handshake_hash.cpp @@ -21,14 +21,19 @@ secure_vector<byte> Handshake_Hash::final(Protocol_Version version, { auto choose_hash = [=]() { if(!version.supports_ciphersuite_specific_prf()) - return "Parallel(MD5,SHA-160)";; + return "Parallel(MD5,SHA-160)"; if(mac_algo == "MD5" || mac_algo == "SHA-1") return "SHA-256"; return mac_algo.c_str(); }; - std::unique_ptr<HashFunction> hash(HashFunction::create(choose_hash())); + const std::string hash_algo = choose_hash(); + std::unique_ptr<HashFunction> hash(HashFunction::create(hash_algo)); + if(!hash) + { + throw Algorithm_Not_Found(hash_algo); + } hash->update(m_data); return hash->final(); } diff --git a/src/lib/tls/tls_handshake_msg.h b/src/lib/tls/tls_handshake_msg.h index 7e527abf4..618ae8d76 100644 --- a/src/lib/tls/tls_handshake_msg.h +++ b/src/lib/tls/tls_handshake_msg.h @@ -1,6 +1,7 @@ /* * TLS Handshake Message * (C) 2012 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -16,6 +17,9 @@ namespace Botan { namespace TLS { +class Handshake_IO; +class Handshake_Hash; + /** * TLS Handshake Message Base Class */ diff --git a/src/lib/tls/tls_handshake_state.cpp b/src/lib/tls/tls_handshake_state.cpp index afc32ba87..71cacdabd 100644 --- a/src/lib/tls/tls_handshake_state.cpp +++ b/src/lib/tls/tls_handshake_state.cpp @@ -8,6 +8,7 @@ #include <botan/internal/tls_handshake_state.h> #include <botan/internal/tls_messages.h> #include <botan/internal/tls_record.h> +#include <botan/tls_callbacks.h> namespace Botan { @@ -174,8 +175,8 @@ std::string handshake_mask_to_string(u32bit mask) /* * Initialize the SSL/TLS Handshake State */ -Handshake_State::Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : - m_msg_callback(cb), +Handshake_State::Handshake_State(Handshake_IO* io, Callbacks& cb) : + m_callbacks(cb), m_handshake_io(io), m_version(m_handshake_io->initial_record_version()) { @@ -183,6 +184,11 @@ Handshake_State::Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : Handshake_State::~Handshake_State() {} +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); diff --git a/src/lib/tls/tls_handshake_state.h b/src/lib/tls/tls_handshake_state.h index 2943a8637..bdec10d14 100644 --- a/src/lib/tls/tls_handshake_state.h +++ b/src/lib/tls/tls_handshake_state.h @@ -24,6 +24,7 @@ class KDF; namespace TLS { +class Callbacks; class Policy; class Hello_Verify_Request; @@ -45,9 +46,7 @@ class Finished; class Handshake_State { public: - typedef std::function<void (const Handshake_Message&)> handshake_msg_cb; - - Handshake_State(Handshake_IO* io, handshake_msg_cb cb); + Handshake_State(Handshake_IO* io, Callbacks& callbacks); virtual ~Handshake_State(); @@ -164,15 +163,10 @@ class Handshake_State const Handshake_Hash& hash() const { return m_handshake_hash; } - void note_message(const Handshake_Message& msg) - { - if(m_msg_callback) - m_msg_callback(msg); - } - + void note_message(const Handshake_Message& msg); private: - handshake_msg_cb m_msg_callback; + Callbacks& m_callbacks; std::unique_ptr<Handshake_IO> m_handshake_io; diff --git a/src/lib/tls/tls_messages.h b/src/lib/tls/tls_messages.h index c6a65b658..8ccb2fbff 100644 --- a/src/lib/tls/tls_messages.h +++ b/src/lib/tls/tls_messages.h @@ -1,6 +1,7 @@ /* * TLS Messages * (C) 2004-2011,2015 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -61,6 +62,26 @@ class Hello_Verify_Request final : public Handshake_Message class Client_Hello final : public Handshake_Message { public: + class Settings + { + 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; } @@ -167,13 +188,11 @@ class Client_Hello final : public Handshake_Message Client_Hello(Handshake_IO& io, Handshake_Hash& hash, - Protocol_Version version, const Policy& policy, RandomNumberGenerator& rng, const std::vector<byte>& reneg_info, - const std::vector<std::string>& next_protocols, - const std::string& hostname = "", - const std::string& srp_identifier = ""); + const Client_Hello::Settings& client_settings, + const std::vector<std::string>& next_protocols); Client_Hello(Handshake_IO& io, Handshake_Hash& hash, @@ -204,6 +223,35 @@ class Client_Hello final : public Handshake_Message class Server_Hello final : public Handshake_Message { public: + class Settings + { + public: + Settings(const std::vector<byte> new_session_id, + Protocol_Version new_session_version, + u16bit ciphersuite, + byte 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<byte>& session_id() const { return m_new_session_id; }; + Protocol_Version protocol_version() const { return m_new_session_version; }; + u16bit ciphersuite() const { return m_ciphersuite; }; + byte compression() const { return m_compression; } + bool offer_session_ticket() const { return m_offer_session_ticket; } + + private: + const std::vector<byte> m_new_session_id; + Protocol_Version m_new_session_version; + u16bit m_ciphersuite; + byte m_compression; + bool m_offer_session_ticket; + }; + + Handshake_Type type() const override { return SERVER_HELLO; } Protocol_Version version() const { return m_version; } @@ -272,12 +320,8 @@ class Server_Hello final : public Handshake_Message RandomNumberGenerator& rng, const std::vector<byte>& secure_reneg_info, const Client_Hello& client_hello, - const std::vector<byte>& new_session_id, - Protocol_Version new_session_version, - u16bit ciphersuite, - byte compression, - bool offer_session_ticket, - const std::string& next_protocol); + const Server_Hello::Settings& settings, + const std::string next_protocol); Server_Hello(Handshake_IO& io, Handshake_Hash& hash, diff --git a/src/lib/tls/tls_record.cpp b/src/lib/tls/tls_record.cpp index c273a1546..877b81b41 100644 --- a/src/lib/tls/tls_record.cpp +++ b/src/lib/tls/tls_record.cpp @@ -1,7 +1,8 @@ /* * TLS Record Handling -* (C) 2012,2013,2014,2015 Jack Lloyd -* (C) 2016 Juraj Somorovsky +* (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) */ @@ -155,7 +156,7 @@ Connection_Cipher_State::format_ad(u64bit msg_sequence, } void write_record(secure_vector<byte>& output, - byte msg_type, const byte msg[], size_t msg_length, + Record_Message msg, Protocol_Version version, u64bit seq, Connection_Cipher_State* cs, @@ -163,7 +164,7 @@ void write_record(secure_vector<byte>& output, { output.clear(); - output.push_back(msg_type); + output.push_back(msg.get_type()); output.push_back(version.major_version()); output.push_back(version.minor_version()); @@ -175,17 +176,17 @@ void write_record(secure_vector<byte>& output, if(!cs) // initial unencrypted handshake records { - output.push_back(get_byte(0, static_cast<u16bit>(msg_length))); - output.push_back(get_byte(1, static_cast<u16bit>(msg_length))); + output.push_back(get_byte<u16bit>(0, static_cast<u16bit>(msg.get_size()))); + output.push_back(get_byte<u16bit>(1, static_cast<u16bit>(msg.get_size()))); - output.insert(output.end(), msg, msg + msg_length); + output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size()); return; } if(AEAD_Mode* aead = cs->aead()) { - const size_t ctext_size = aead->output_length(msg_length); + const size_t ctext_size = aead->output_length(msg.get_size()); const std::vector<byte> nonce = cs->aead_nonce(seq); @@ -196,17 +197,16 @@ void write_record(secure_vector<byte>& output, output.push_back(get_byte(0, static_cast<u16bit>(rec_size))); output.push_back(get_byte(1, static_cast<u16bit>(rec_size))); - aead->set_ad(cs->format_ad(seq, msg_type, version, static_cast<u16bit>(msg_length))); + aead->set_ad(cs->format_ad(seq, msg.get_type(), version, static_cast<u16bit>(msg.get_size()))); if(cs->nonce_bytes_from_record() > 0) { output += std::make_pair(&nonce[cs->nonce_bytes_from_handshake()], cs->nonce_bytes_from_record()); } - BOTAN_ASSERT(aead->start(nonce).empty(), "AEAD doesn't return anything from start"); const size_t offset = output.size(); - output += std::make_pair(msg, msg_length); + output += std::make_pair(msg.get_data(), msg.get_size()); aead->finish(output, offset); BOTAN_ASSERT(output.size() == offset + ctext_size, "Expected size"); @@ -222,11 +222,11 @@ void write_record(secure_vector<byte>& output, if(!cs->uses_encrypt_then_mac()) { - cs->mac()->update(cs->format_ad(seq, msg_type, version, static_cast<u16bit>(msg_length))); - cs->mac()->update(msg, msg_length); + cs->mac()->update(cs->format_ad(seq, msg.get_type(), version, static_cast<u16bit>(msg.get_size()))); + cs->mac()->update(msg.get_data(), msg.get_size()); const size_t buf_size = round_up( - iv_size + msg_length + mac_size + (block_size ? 1 : 0), + iv_size + msg.get_size() + mac_size + (block_size ? 1 : 0), block_size); if(buf_size > MAX_CIPHERTEXT_SIZE) @@ -243,7 +243,7 @@ void write_record(secure_vector<byte>& output, rng.randomize(&output[output.size() - iv_size], iv_size); } - output.insert(output.end(), msg, msg + msg_length); + output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size()); output.resize(output.size() + mac_size); cs->mac()->final(&output[output.size() - mac_size]); @@ -251,7 +251,7 @@ void write_record(secure_vector<byte>& output, if(block_size) { const size_t pad_val = - buf_size - (iv_size + msg_length + mac_size + 1); + buf_size - (iv_size + msg.get_size() + mac_size + 1); for(size_t i = 0; i != pad_val + 1; ++i) output.push_back(static_cast<byte>(pad_val)); @@ -294,7 +294,7 @@ void write_record(secure_vector<byte>& output, else { const size_t enc_size = round_up( - iv_size + msg_length + (block_size ? 1 : 0), + iv_size + msg.get_size() + (block_size ? 1 : 0), block_size); const size_t buf_size = enc_size + mac_size; @@ -313,12 +313,12 @@ void write_record(secure_vector<byte>& output, rng.randomize(&output[output.size() - iv_size], iv_size); } - output.insert(output.end(), msg, msg + msg_length); + output.insert(output.end(), msg.get_data(), msg.get_data() + msg.get_size()); if(block_size) { const size_t pad_val = - enc_size - (iv_size + msg_length + 1); + enc_size - (iv_size + msg.get_size() + 1); for(size_t i = 0; i != pad_val + 1; ++i) output.push_back(pad_val); @@ -347,7 +347,7 @@ void write_record(secure_vector<byte>& output, cbc_state.assign(&buf[block_size*(blocks-1)], &buf[block_size*blocks]); - cs->mac()->update(cs->format_ad(seq, msg_type, version, enc_size)); + cs->mac()->update(cs->format_ad(seq, msg.get_type(), version, enc_size)); cs->mac()->update(buf, enc_size); output.resize(output.size() + mac_size); @@ -575,65 +575,58 @@ void decrypt_record(secure_vector<byte>& output, } size_t read_tls_record(secure_vector<byte>& readbuf, - const byte input[], - size_t input_sz, - size_t& consumed, - secure_vector<byte>& record, - u64bit* record_sequence, - Protocol_Version* record_version, - Record_Type* record_type, + Record_Raw_Input& raw_input, + Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { - consumed = 0; - if(readbuf.size() < TLS_HEADER_SIZE) // header incomplete? { if(size_t needed = fill_buffer_to(readbuf, - input, input_sz, consumed, + 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"); } - *record_version = Protocol_Version(readbuf[1], readbuf[2]); + *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]); - BOTAN_ASSERT(!record_version->is_datagram_protocol(), "Expected TLS"); + BOTAN_ASSERT(!rec.get_protocol_version()->is_datagram_protocol(), "Expected TLS"); - const size_t record_len = make_u16bit(readbuf[TLS_HEADER_SIZE-2], + const size_t record_size = make_u16bit(readbuf[TLS_HEADER_SIZE-2], readbuf[TLS_HEADER_SIZE-1]); - if(record_len > MAX_CIPHERTEXT_SIZE) + if(record_size > MAX_CIPHERTEXT_SIZE) throw TLS_Exception(Alert::RECORD_OVERFLOW, "Received a record that exceeds maximum size"); - if(record_len == 0) + if(record_size == 0) throw TLS_Exception(Alert::DECODE_ERROR, "Received a completely empty record"); if(size_t needed = fill_buffer_to(readbuf, - input, input_sz, consumed, - TLS_HEADER_SIZE + record_len)) + raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), + TLS_HEADER_SIZE + record_size)) return needed; - BOTAN_ASSERT_EQUAL(static_cast<size_t>(TLS_HEADER_SIZE) + record_len, + BOTAN_ASSERT_EQUAL(static_cast<size_t>(TLS_HEADER_SIZE) + record_size, readbuf.size(), "Have the full record"); - *record_type = static_cast<Record_Type>(readbuf[0]); + *rec.get_type() = static_cast<Record_Type>(readbuf[0]); u16bit epoch = 0; if(sequence_numbers) { - *record_sequence = sequence_numbers->next_read_sequence(); + *rec.get_sequence() = sequence_numbers->next_read_sequence(); epoch = sequence_numbers->current_read_epoch(); } else { // server initial handshake case - *record_sequence = 0; + *rec.get_sequence() = 0; epoch = 0; } @@ -641,7 +634,7 @@ size_t read_tls_record(secure_vector<byte>& readbuf, if(epoch == 0) // Unencrypted initial handshake { - record.assign(readbuf.begin() + TLS_HEADER_SIZE, readbuf.begin() + TLS_HEADER_SIZE + record_len); + rec.get_data().assign(readbuf.begin() + TLS_HEADER_SIZE, readbuf.begin() + TLS_HEADER_SIZE + record_size); readbuf.clear(); return 0; // got a full record } @@ -651,37 +644,30 @@ size_t read_tls_record(secure_vector<byte>& readbuf, BOTAN_ASSERT(cs, "Have cipherstate for this epoch"); - decrypt_record(record, + decrypt_record(rec.get_data(), record_contents, - record_len, - *record_sequence, - *record_version, - *record_type, + record_size, + *rec.get_sequence(), + *rec.get_protocol_version(), + *rec.get_type(), *cs); if(sequence_numbers) - sequence_numbers->read_accept(*record_sequence); + sequence_numbers->read_accept(*rec.get_sequence()); readbuf.clear(); return 0; } size_t read_dtls_record(secure_vector<byte>& readbuf, - const byte input[], - size_t input_sz, - size_t& consumed, - secure_vector<byte>& record, - u64bit* record_sequence, - Protocol_Version* record_version, - Record_Type* record_type, + Record_Raw_Input& raw_input, + Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { - consumed = 0; - if(readbuf.size() < DTLS_HEADER_SIZE) // header incomplete? { - if(fill_buffer_to(readbuf, input, input_sz, consumed, DTLS_HEADER_SIZE)) + if(fill_buffer_to(readbuf, raw_input.get_data(), raw_input.get_size(), raw_input.get_consumed(), DTLS_HEADER_SIZE)) { readbuf.clear(); return 0; @@ -690,38 +676,35 @@ size_t read_dtls_record(secure_vector<byte>& readbuf, BOTAN_ASSERT_EQUAL(readbuf.size(), DTLS_HEADER_SIZE, "Have an entire header"); } - *record_version = Protocol_Version(readbuf[1], readbuf[2]); + *rec.get_protocol_version() = Protocol_Version(readbuf[1], readbuf[2]); - BOTAN_ASSERT(record_version->is_datagram_protocol(), "Expected DTLS"); + BOTAN_ASSERT(rec.get_protocol_version()->is_datagram_protocol(), "Expected DTLS"); - const size_t record_len = make_u16bit(readbuf[DTLS_HEADER_SIZE-2], - readbuf[DTLS_HEADER_SIZE-1]); + const size_t record_size = make_u16bit(readbuf[DTLS_HEADER_SIZE-2], + readbuf[DTLS_HEADER_SIZE-1]); - // Invalid packet: - if(record_len == 0 || record_len > MAX_CIPHERTEXT_SIZE) - { - readbuf.clear(); - return 0; - } + if(record_size > MAX_CIPHERTEXT_SIZE) + throw TLS_Exception(Alert::RECORD_OVERFLOW, + "Got message that exceeds maximum size"); - if(fill_buffer_to(readbuf, input, input_sz, consumed, DTLS_HEADER_SIZE + record_len)) + 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<size_t>(DTLS_HEADER_SIZE) + record_len, readbuf.size(), + BOTAN_ASSERT_EQUAL(static_cast<size_t>(DTLS_HEADER_SIZE) + record_size, readbuf.size(), "Have the full record"); - *record_type = static_cast<Record_Type>(readbuf[0]); + *rec.get_type() = static_cast<Record_Type>(readbuf[0]); u16bit epoch = 0; - *record_sequence = load_be<u64bit>(&readbuf[3], 0); - epoch = (*record_sequence >> 48); + *rec.get_sequence() = load_be<u64bit>(&readbuf[3], 0); + epoch = (*rec.get_sequence() >> 48); - if(sequence_numbers && sequence_numbers->already_seen(*record_sequence)) + if(sequence_numbers && sequence_numbers->already_seen(*rec.get_sequence())) { readbuf.clear(); return 0; @@ -731,7 +714,7 @@ size_t read_dtls_record(secure_vector<byte>& readbuf, if(epoch == 0) // Unencrypted initial handshake { - record.assign(readbuf.begin() + DTLS_HEADER_SIZE, readbuf.begin() + DTLS_HEADER_SIZE + record_len); + rec.get_data().assign(readbuf.begin() + DTLS_HEADER_SIZE, readbuf.begin() + DTLS_HEADER_SIZE + record_size); readbuf.clear(); return 0; // got a full record } @@ -743,23 +726,23 @@ size_t read_dtls_record(secure_vector<byte>& readbuf, BOTAN_ASSERT(cs, "Have cipherstate for this epoch"); - decrypt_record(record, + decrypt_record(rec.get_data(), record_contents, - record_len, - *record_sequence, - *record_version, - *record_type, + record_size, + *rec.get_sequence(), + *rec.get_protocol_version(), + *rec.get_type(), *cs); } catch(std::exception) { readbuf.clear(); - *record_type = NO_RECORD; + *rec.get_type() = NO_RECORD; return 0; } if(sequence_numbers) - sequence_numbers->read_accept(*record_sequence); + sequence_numbers->read_accept(*rec.get_sequence()); readbuf.clear(); return 0; @@ -768,24 +751,16 @@ size_t read_dtls_record(secure_vector<byte>& readbuf, } size_t read_record(secure_vector<byte>& readbuf, - const byte input[], - size_t input_sz, - bool is_datagram, - size_t& consumed, - secure_vector<byte>& record, - u64bit* record_sequence, - Protocol_Version* record_version, - Record_Type* record_type, + Record_Raw_Input& raw_input, + Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate) { - if(is_datagram) - return read_dtls_record(readbuf, input, input_sz, consumed, - record, record_sequence, record_version, record_type, + if(raw_input.is_datagram()) + return read_dtls_record(readbuf, raw_input, rec, sequence_numbers, get_cipherstate); else - return read_tls_record(readbuf, input, input_sz, consumed, - record, record_sequence, record_version, record_type, + return read_tls_record(readbuf, raw_input, rec, sequence_numbers, get_cipherstate); } diff --git a/src/lib/tls/tls_record.h b/src/lib/tls/tls_record.h index 9180aa554..4420a9c66 100644 --- a/src/lib/tls/tls_record.h +++ b/src/lib/tls/tls_record.h @@ -1,6 +1,7 @@ /* * TLS Record Handling * (C) 2004-2012 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -95,6 +96,80 @@ class Connection_Cipher_State bool m_uses_encrypt_then_mac; }; +class Record + { + public: + Record(secure_vector<byte>& data, + u64bit* 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<byte>& get_data() { return m_data; } + + Protocol_Version* get_protocol_version() { return m_protocol_version; } + + u64bit* get_sequence() { return m_sequence; } + + Record_Type* get_type() { return m_type; } + + size_t& get_size() { return m_size; } + + private: + secure_vector<byte>& m_data; + u64bit* m_sequence; + Protocol_Version* m_protocol_version; + Record_Type* m_type; + size_t m_size; + }; + +class Record_Message + { + public: + Record_Message(const byte* data, size_t size) + : m_type(0), m_sequence(0), m_data(data), m_size(size) {}; + Record_Message(byte type, u64bit sequence, const byte* data, size_t size) + : m_type(type), m_sequence(sequence), m_data(data), + m_size(size) {}; + + byte& get_type() { return m_type; }; + u64bit& get_sequence() { return m_sequence; }; + const byte* get_data() { return m_data; }; + size_t& get_size() { return m_size; }; + + private: + byte m_type; + u64bit m_sequence; + const byte* m_data; + size_t m_size; +}; + +class Record_Raw_Input + { + public: + Record_Raw_Input(const byte* 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 byte*& 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 byte* 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 @@ -108,7 +183,7 @@ class Connection_Cipher_State * @return number of bytes written to write_buffer */ void write_record(secure_vector<byte>& write_buffer, - byte msg_type, const byte msg[], size_t msg_length, + Record_Message rec_msg, Protocol_Version version, u64bit msg_sequence, Connection_Cipher_State* cipherstate, @@ -122,14 +197,8 @@ typedef std::function<std::shared_ptr<Connection_Cipher_State> (u16bit)> get_cip * @return zero if full message, else number of bytes still needed */ size_t read_record(secure_vector<byte>& read_buffer, - const byte input[], - size_t input_length, - bool is_datagram, - size_t& input_consumed, - secure_vector<byte>& record, - u64bit* record_sequence, - Protocol_Version* record_version, - Record_Type* record_type, + Record_Raw_Input& raw_input, + Record& rec, Connection_Sequence_Numbers* sequence_numbers, get_cipherstate_fn get_cipherstate); diff --git a/src/lib/tls/tls_server.cpp b/src/lib/tls/tls_server.cpp index 78c9087e0..40aa18d27 100644 --- a/src/lib/tls/tls_server.cpp +++ b/src/lib/tls/tls_server.cpp @@ -1,6 +1,7 @@ /* * TLS Server * (C) 2004-2011,2012,2016 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,30 +10,41 @@ #include <botan/internal/tls_handshake_state.h> #include <botan/internal/tls_messages.h> #include <botan/internal/stl_util.h> +#include <botan/tls_magic.h> namespace Botan { namespace TLS { -namespace { - class Server_Handshake_State : public Handshake_State { public: - // using Handshake_State::Handshake_State; + 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; } - Server_Handshake_State(Handshake_IO* io, handshake_msg_cb cb) : Handshake_State(io, cb) {} + private: // Used by the server only, in case of RSA key exchange. Not owned - Private_Key* server_rsa_kex_key = nullptr; + 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 allow_session_resumption = true; + bool m_allow_session_resumption = true; }; +namespace { + bool check_for_resume(Session& session_info, Session_Manager& session_manager, Credentials_Manager& credentials, @@ -238,6 +250,19 @@ get_server_certs(const std::string& hostname, /* * 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, @@ -249,13 +274,15 @@ Server::Server(output_fn output, 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), + 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, @@ -276,8 +303,7 @@ Server::Server(output_fn output, Handshake_State* Server::new_handshake_state(Handshake_IO* io) { - std::unique_ptr<Handshake_State> state( - new Server_Handshake_State(io, get_handshake_msg_cb())); + std::unique_ptr<Handshake_State> state(new Server_Handshake_State(io, callbacks())); state->set_expected_next(CLIENT_HELLO); return state.release(); @@ -297,442 +323,516 @@ Server::get_peer_cert_chain(const Handshake_State& state) const void Server::initiate_handshake(Handshake_State& state, bool force_full_renegotiation) { - dynamic_cast<Server_Handshake_State&>(state).allow_session_resumption = - !force_full_renegotiation; + dynamic_cast<Server_Handshake_State&>(state). + set_allow_session_resumption(!force_full_renegotiation); Hello_Request hello_req(state.handshake_io()); } /* -* Process a handshake message +* Process a CLIENT HELLO Message */ -void Server::process_handshake_msg(const Handshake_State* active_state, - Handshake_State& state_base, - Handshake_Type type, - const std::vector<byte>& contents) - { - Server_Handshake_State& state = dynamic_cast<Server_Handshake_State&>(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) +void Server::process_client_hello_msg(const Handshake_State* active_state, + Server_Handshake_State& pending_state, + const std::vector<byte>& contents) +{ + const bool initial_handshake = !active_state; + + if(!policy().allow_insecure_renegotiation() && + !(initial_handshake || secure_renegotiation_supported())) { - state.hash().update(state.handshake_io().format(contents, type)); + send_warning_alert(Alert::NO_RENEGOTIATION); + return; } - if(type == CLIENT_HELLO) + pending_state.client_hello(new Client_Hello(contents)); + const Protocol_Version client_version = pending_state.client_hello()->version(); + + 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())) { - const bool initial_handshake = !active_state; + /* + Common cases: new client hello with some known version, or a + renegotiation using the same version as previously + negotiated. + */ - if(!policy().allow_insecure_renegotiation() && - !(initial_handshake || secure_renegotiation_supported())) + 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) { - send_warning_alert(Alert::NO_RENEGOTIATION); - return; + 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; + } - state.client_hello(new Client_Hello(contents)); + if(!policy().acceptable_protocol_version(negotiated_version)) + { + throw TLS_Exception(Alert::PROTOCOL_VERSION, + "Client version " + negotiated_version.to_string() + + " is unacceptable by policy"); + } - const Protocol_Version client_version = state.client_hello()->version(); + 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"); + } - Protocol_Version negotiated_version; + secure_renegotiation_check(pending_state.client_hello()); - const Protocol_Version latest_supported = - policy().latest_supported_version(client_version.is_datagram_protocol()); + pending_state.set_version(negotiated_version); - 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. - */ + 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())); - 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; - } + bool have_session_ticket_key = false; - if(!policy().acceptable_protocol_version(negotiated_version)) - { - throw TLS_Exception(Alert::PROTOCOL_VERSION, - "Client version " + negotiated_version.to_string() + - " is unacceptable by policy"); - } + 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(state.client_hello()->sent_fallback_scsv()) + // if the callback return was empty, fall back to the (deprecated) std::function + if(m_next_protocol.empty() && m_choose_next_protocol) { - if(latest_supported > client_version) - throw TLS_Exception(Alert::INAPPROPRIATE_FALLBACK, - "Client signalled fallback SCSV, possible attack"); + m_next_protocol = m_choose_next_protocol(pending_state.client_hello()->next_protocols()); } + } - secure_renegotiation_check(state.client_hello()); + 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); + } +} - state.set_version(negotiated_version); +void Server::process_certificate_msg(Server_Handshake_State& pending_state, + const std::vector<byte>& contents) +{ + pending_state.client_certs(new Certificate(contents, policy())); + pending_state.set_expected_next(CLIENT_KEX); +} - Session session_info; - const bool resuming = - state.allow_session_resumption && - check_for_resume(session_info, - session_manager(), - m_creds, - state.client_hello(), - std::chrono::seconds(policy().session_ticket_lifetime())); +void Server::process_client_key_exchange_msg(Server_Handshake_State& pending_state, + const std::vector<byte>& 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); - bool have_session_ticket_key = false; + pending_state.client_kex( + new Client_Key_Exchange(contents, pending_state, + pending_state.server_rsa_kex_key(), + m_creds, policy(), rng()) + ); - try - { - have_session_ticket_key = - m_creds.psk("tls-server", "session-ticket", "").length() > 0; - } - catch(...) {} + pending_state.compute_session_keys(); +} - m_next_protocol = ""; - if(m_choose_next_protocol && state.client_hello()->supports_alpn()) - m_next_protocol = m_choose_next_protocol(state.client_hello()->next_protocols()); +void Server::process_change_cipher_spec_msg(Server_Handshake_State& pending_state) +{ + pending_state.set_expected_next(FINISHED); + change_cipher_spec_reader(SERVER); +} - if(resuming) - { - // 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 = - (state.client_hello()->supports_session_ticket() && - state.client_hello()->session_ticket().empty() && - have_session_ticket_key); - - state.server_hello(new Server_Hello( - state.handshake_io(), - state.hash(), - policy(), - rng(), - secure_renegotiation_data_for_server_hello(), - *state.client_hello(), - session_info, - offer_new_session_ticket, - m_next_protocol - )); - - secure_renegotiation_check(state.server_hello()); - - state.compute_session_keys(session_info.master_secret()); - - if(!save_session(session_info)) - { - session_manager().remove_entry(session_info.session_id()); - - if(state.server_hello()->supports_session_ticket()) // send an empty ticket - { - state.new_session_ticket( - new New_Session_Ticket(state.handshake_io(), - state.hash()) - ); - } - } +void Server::process_certificate_verify_msg(Server_Handshake_State& pending_state, + Handshake_Type type, + const std::vector<byte>& contents) +{ + pending_state.client_verify ( new Certificate_Verify ( contents, pending_state.version() ) ); + + const std::vector<X509_Certificate>& 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 + { + m_creds.verify_certificate_chain ( "tls-server", "", client_certs ); + } + catch ( std::exception& e ) + { + throw TLS_Exception ( Alert::BAD_CERTIFICATE, e.what() ); + } + + pending_state.set_expected_next ( HANDSHAKE_CCS ); +} - if(state.server_hello()->supports_session_ticket() && !state.new_session_ticket()) - { - try - { - const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", ""); - - state.new_session_ticket( - new New_Session_Ticket(state.handshake_io(), - state.hash(), - session_info.encrypt(ticket_key, rng()), - policy().session_ticket_lifetime()) - ); - } - catch(...) {} - - if(!state.new_session_ticket()) - { - state.new_session_ticket( - new New_Session_Ticket(state.handshake_io(), state.hash()) - ); - } - } +void Server::process_finished_msg(Server_Handshake_State& pending_state, + Handshake_Type type, + const std::vector<byte>& contents) +{ + pending_state.set_expected_next ( HANDSHAKE_NONE ); - state.handshake_io().send(Change_Cipher_Spec()); + pending_state.client_finished ( new Finished ( contents ) ); - change_cipher_spec_writer(SERVER); + if ( !pending_state.client_finished()->verify ( pending_state, CLIENT ) ) + throw TLS_Exception ( Alert::DECRYPT_ERROR, + "Finished message didn't verify" ); - state.server_finished(new Finished(state.handshake_io(), state, SERVER)); - state.set_expected_next(HANDSHAKE_CCS); - } - else // new session - { - std::map<std::string, std::vector<X509_Certificate> > cert_chains; + if ( !pending_state.server_finished() ) + { + // already sent finished if resuming, so this is a new session - const std::string sni_hostname = state.client_hello()->sni_hostname(); + pending_state.hash().update ( pending_state.handshake_io().format ( contents, type ) ); - cert_chains = get_server_certs(sni_hostname, m_creds); + 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<byte>(), + Server_Information(pending_state.client_hello()->sni_hostname()), + pending_state.srp_identifier(), + pending_state.server_hello()->srtp_profile() + ); - if(sni_hostname != "" && cert_chains.empty()) + if ( save_session ( session_info ) ) { - 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)); + 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 ); } - state.server_hello(new Server_Hello( - state.handshake_io(), - state.hash(), - policy(), - rng(), - secure_renegotiation_data_for_server_hello(), - *state.client_hello(), - make_hello_random(rng(), policy()), // new session ID - state.version(), - choose_ciphersuite(policy(), state.version(), m_creds, cert_chains, state.client_hello()), - choose_compression(policy(), state.client_hello()->compression_methods()), - have_session_ticket_key, - m_next_protocol) + 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() ) ); + } - secure_renegotiation_check(state.server_hello()); + pending_state.handshake_io().send ( Change_Cipher_Spec() ); - const std::string sig_algo = state.ciphersuite().sig_algo(); - const std::string kex_algo = state.ciphersuite().kex_algo(); + change_cipher_spec_writer ( SERVER ); - if(sig_algo != "") - { - BOTAN_ASSERT(!cert_chains[sig_algo].empty(), - "Attempting to send empty certificate chain"); + pending_state.server_finished ( new Finished ( pending_state.handshake_io(), pending_state, SERVER ) ); + } - state.server_certs(new Certificate(state.handshake_io(), - state.hash(), - cert_chains[sig_algo])); - } + activate_session(); - Private_Key* private_key = nullptr; +} - if(kex_algo == "RSA" || sig_algo != "") - { - private_key = m_creds.private_key_for( - state.server_certs()->cert_chain()[0], - "tls-server", - sni_hostname); +/* +* Process a handshake message +*/ +void Server::process_handshake_msg(const Handshake_State* active_state, + Handshake_State& state_base, + Handshake_Type type, + const std::vector<byte>& contents) + { + Server_Handshake_State& state = dynamic_cast<Server_Handshake_State&>(state_base); + state.confirm_transition_to(type); - if(!private_key) - throw Internal_Error("No private key located for associated server cert"); - } + /* + * 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)); + } - if(kex_algo == "RSA") - { - state.server_rsa_kex_key = private_key; - } - else - { - state.server_kex(new Server_Key_Exchange(state.handshake_io(), - state, policy(), - m_creds, rng(), private_key)); - } + switch(type) + { + case CLIENT_HELLO: + this->process_client_hello_msg(active_state, state, contents); + break; - auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname); + case CERTIFICATE: + this->process_certificate_msg(state, contents); + break; + + case CLIENT_KEX: + this->process_client_key_exchange_msg(state, contents); + break; + + case CERTIFICATE_VERIFY: + this->process_certificate_verify_msg(state, type, contents); + break; + + case HANDSHAKE_CCS: + this->process_change_cipher_spec_msg(state); + break; + + case FINISHED: + this->process_finished_msg(state, type, contents); + break; + + default: + throw Unexpected_Message("Unknown handshake message received"); + break; + } + } - std::vector<X509_DN> client_auth_CAs; +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()); + + if(!save_session(session_info)) + { + session_manager().remove_entry(session_info.session_id()); - for(auto store : trusted_CAs) + if(pending_state.server_hello()->supports_session_ticket()) // send an empty ticket { - auto subjects = store->all_subjects(); - client_auth_CAs.insert(client_auth_CAs.end(), subjects.begin(), subjects.end()); + pending_state.new_session_ticket( + new New_Session_Ticket(pending_state.handshake_io(), + pending_state.hash()) + ); } + } - if(!client_auth_CAs.empty() && state.ciphersuite().sig_algo() != "") + if(pending_state.server_hello()->supports_session_ticket() && !pending_state.new_session_ticket()) + { + try { - state.cert_req( - new Certificate_Req(state.handshake_io(), state.hash(), - policy(), client_auth_CAs, state.version())); + const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", ""); - state.set_expected_next(CERTIFICATE); + 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 the client doesn't have a cert they want to use they are - * allowed to send either an empty cert message or proceed - * directly to the client key exchange, so allow either case. - */ - state.set_expected_next(CLIENT_KEX); - - state.server_hello_done(new Server_Hello_Done(state.handshake_io(), state.hash())); + if(!pending_state.new_session_ticket()) + { + pending_state.new_session_ticket( + new New_Session_Ticket(pending_state.handshake_io(), pending_state.hash()) + ); + } } - } - else if(type == CERTIFICATE) - { - state.client_certs(new Certificate(contents, policy())); - state.set_expected_next(CLIENT_KEX); - } - else if(type == CLIENT_KEX) - { - if(state.received_handshake_msg(CERTIFICATE) && !state.client_certs()->empty()) - state.set_expected_next(CERTIFICATE_VERIFY); - else - state.set_expected_next(HANDSHAKE_CCS); + pending_state.handshake_io().send(Change_Cipher_Spec()); - state.client_kex( - new Client_Key_Exchange(contents, state, - state.server_rsa_kex_key, - m_creds, policy(), rng()) - ); + change_cipher_spec_writer(SERVER); - state.compute_session_keys(); - } - else if(type == CERTIFICATE_VERIFY) - { - state.client_verify(new Certificate_Verify(contents, state.version())); + 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<std::string, std::vector<X509_Certificate> > cert_chains; - const std::vector<X509_Certificate>& client_certs = - state.client_certs()->cert_chain(); + const std::string sni_hostname = pending_state.client_hello()->sni_hostname(); - const bool sig_valid = - state.client_verify()->verify(client_certs[0], state, policy()); + cert_chains = get_server_certs(sni_hostname, m_creds); - state.hash().update(state.handshake_io().format(contents, type)); + if(sni_hostname != "" && cert_chains.empty()) + { + cert_chains = get_server_certs("", m_creds); /* - * 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, ..." + * 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(!sig_valid) - throw TLS_Exception(Alert::DECRYPT_ERROR, "Client cert verify failed"); - - try - { - m_creds.verify_certificate_chain("tls-server", "", client_certs); - } - catch(std::exception& e) - { - throw TLS_Exception(Alert::BAD_CERTIFICATE, e.what()); - } - - state.set_expected_next(HANDSHAKE_CCS); + if(!cert_chains.empty()) + send_alert(Alert(Alert::UNRECOGNIZED_NAME)); } - else if(type == HANDSHAKE_CCS) - { - state.set_expected_next(FINISHED); - change_cipher_spec_reader(SERVER); - } - else if(type == FINISHED) + + Server_Hello::Settings srv_settings( + make_hello_random(rng(), policy()), // new session ID + pending_state.version(), + choose_ciphersuite(policy(), + pending_state.version(), + m_creds, + cert_chains, + pending_state.client_hello()), + 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 != "") { - state.set_expected_next(HANDSHAKE_NONE); + BOTAN_ASSERT(!cert_chains[sig_algo].empty(), + "Attempting to send empty certificate chain"); - state.client_finished(new Finished(contents)); + pending_state.server_certs(new Certificate(pending_state.handshake_io(), + pending_state.hash(), + cert_chains[sig_algo])); + } - if(!state.client_finished()->verify(state, CLIENT)) - throw TLS_Exception(Alert::DECRYPT_ERROR, - "Finished message didn't verify"); + Private_Key* private_key = nullptr; - if(!state.server_finished()) - { - // already sent finished if resuming, so this is a new session + if(kex_algo == "RSA" || sig_algo != "") + { + private_key = m_creds.private_key_for( + pending_state.server_certs()->cert_chain()[0], + "tls-server", + sni_hostname); - state.hash().update(state.handshake_io().format(contents, type)); + if(!private_key) + throw Internal_Error("No private key located for associated server cert"); + } - Session session_info( - state.server_hello()->session_id(), - state.session_keys().master_secret(), - state.server_hello()->version(), - state.server_hello()->ciphersuite(), - state.server_hello()->compression_method(), - SERVER, - state.server_hello()->supports_extended_master_secret(), - state.server_hello()->supports_encrypt_then_mac(), - get_peer_cert_chain(state), - std::vector<byte>(), - Server_Information(state.client_hello()->sni_hostname()), - state.srp_identifier(), - state.server_hello()->srtp_profile() - ); + 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)); + } - if(save_session(session_info)) - { - if(state.server_hello()->supports_session_ticket()) - { - try - { - const SymmetricKey ticket_key = m_creds.psk("tls-server", "session-ticket", ""); - - state.new_session_ticket( - new New_Session_Ticket(state.handshake_io(), - state.hash(), - session_info.encrypt(ticket_key, rng()), - policy().session_ticket_lifetime()) - ); - } - catch(...) {} - } - else - session_manager().save(session_info); - } + auto trusted_CAs = m_creds.trusted_certificate_authorities("tls-server", sni_hostname); - if(!state.new_session_ticket() && - state.server_hello()->supports_session_ticket()) - { - state.new_session_ticket( - new New_Session_Ticket(state.handshake_io(), state.hash()) - ); - } + std::vector<X509_DN> client_auth_CAs; - state.handshake_io().send(Change_Cipher_Spec()); + for(auto store : trusted_CAs) + { + auto subjects = store->all_subjects(); + client_auth_CAs.insert(client_auth_CAs.end(), subjects.begin(), subjects.end()); + } - change_cipher_spec_writer(SERVER); + 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())); + + pending_state.set_expected_next(CERTIFICATE); + } - state.server_finished(new Finished(state.handshake_io(), state, SERVER)); - } + /* + * If the client doesn't have a cert they want to use they are + * allowed to send either an empty cert message or proceed + * directly to the client key exchange, so allow either case. + */ + pending_state.set_expected_next(CLIENT_KEX); - activate_session(); - } - else - throw Unexpected_Message("Unknown handshake message received"); + pending_state.server_hello_done(new Server_Hello_Done(pending_state.handshake_io(), pending_state.hash())); } - } } diff --git a/src/lib/tls/tls_server.h b/src/lib/tls/tls_server.h index 5ea2a1318..051eda445 100644 --- a/src/lib/tls/tls_server.h +++ b/src/lib/tls/tls_server.h @@ -1,6 +1,7 @@ /* * TLS Server * (C) 2004-2011 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -12,10 +13,13 @@ #include <botan/credentials_manager.h> #include <vector> + namespace Botan { namespace TLS { +class Server_Handshake_State; + /** * TLS Server */ @@ -26,7 +30,39 @@ class BOTAN_DLL Server final : public Channel /** * 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, @@ -37,9 +73,14 @@ class BOTAN_DLL Server final : public Channel RandomNumberGenerator& rng, next_protocol_fn next_proto = next_protocol_fn(), bool is_datagram = false, - size_t reserved_io_buffer_size = 16*1024 + 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, @@ -73,12 +114,40 @@ class BOTAN_DLL Server final : public Channel Handshake_Type type, const std::vector<byte>& contents) override; + void process_client_hello_msg(const Handshake_State* active_state, + Server_Handshake_State& pending_state, + const std::vector<byte>& contents); + + void process_certificate_msg(Server_Handshake_State& pending_state, + const std::vector<byte>& contents); + + void process_client_key_exchange_msg(Server_Handshake_State& pending_state, + const std::vector<byte>& 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<byte>& contents); + + void process_finished_msg(Server_Handshake_State& pending_state, + Handshake_Type type, + const std::vector<byte>& 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; - std::string m_next_protocol; }; } diff --git a/src/lib/tls/tls_session_key.cpp b/src/lib/tls/tls_session_key.cpp index 0e796aa23..193af8d9f 100644 --- a/src/lib/tls/tls_session_key.cpp +++ b/src/lib/tls/tls_session_key.cpp @@ -48,28 +48,30 @@ Session_Keys::Session_Keys(const Handshake_State* state, else { secure_vector<byte> salt; + secure_vector<byte> label; if(extended_master_secret) { - salt += std::make_pair(EXT_MASTER_SECRET_MAGIC, sizeof(EXT_MASTER_SECRET_MAGIC)); + label += std::make_pair(EXT_MASTER_SECRET_MAGIC, sizeof(EXT_MASTER_SECRET_MAGIC)); salt += state->hash().final(state->version(), state->ciphersuite().prf_algo()); } else { - salt += std::make_pair(MASTER_SECRET_MAGIC, sizeof(MASTER_SECRET_MAGIC)); + 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); + m_master_sec = prf->derive_key(48, pre_master_secret, salt, label); } secure_vector<byte> salt; - salt += std::make_pair(KEY_GEN_MAGIC, sizeof(KEY_GEN_MAGIC)); + secure_vector<byte> 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); + SymmetricKey keyblock = prf->derive_key(prf_gen, m_master_sec, salt, label); const byte* key_data = keyblock.begin(); diff --git a/src/lib/tls/tls_suite_info.cpp b/src/lib/tls/tls_suite_info.cpp index 0d08710e8..7a2c62d56 100644 --- a/src/lib/tls/tls_suite_info.cpp +++ b/src/lib/tls/tls_suite_info.cpp @@ -2,8 +2,8 @@ * TLS cipher suite information * * This file was automatically generated from the IANA assignments -* (tls-parameters.txt hash fe280cb8b13bfdd306a975ab39fda238f77ae3bc) -* by ./src/scripts/tls_suite_info.py on 2016-04-04 +* (tls-parameters.txt hash 9546b3c8be1a1202e1d4a07c2a9d7d6394ae4a21) +* by ./src/scripts/tls_suite_info.py on 2016-08-16 * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -14,659 +14,174 @@ namespace Botan { namespace TLS { -std::vector<u16bit> Ciphersuite::all_known_ciphersuite_ids() +//static +const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites() { - return std::vector<u16bit>{ - 0x000A, - 0x0013, - 0x0016, - 0x001B, - 0x002F, - 0x0032, - 0x0033, - 0x0034, - 0x0035, - 0x0038, - 0x0039, - 0x003A, - 0x003C, - 0x003D, - 0x0040, - 0x0041, - 0x0044, - 0x0045, - 0x0046, - 0x0067, - 0x006A, - 0x006B, - 0x006C, - 0x006D, - 0x0084, - 0x0087, - 0x0088, - 0x0089, - 0x008B, - 0x008C, - 0x008D, - 0x008F, - 0x0090, - 0x0091, - 0x0096, - 0x0099, - 0x009A, - 0x009B, - 0x009C, - 0x009D, - 0x009E, - 0x009F, - 0x00A2, - 0x00A3, - 0x00A6, - 0x00A7, - 0x00A8, - 0x00A9, - 0x00AA, - 0x00AB, - 0x00AE, - 0x00AF, - 0x00B2, - 0x00B3, - 0x00BA, - 0x00BD, - 0x00BE, - 0x00BF, - 0x00C0, - 0x00C3, - 0x00C4, - 0x00C5, - 0xC008, - 0xC009, - 0xC00A, - 0xC012, - 0xC013, - 0xC014, - 0xC017, - 0xC018, - 0xC019, - 0xC01A, - 0xC01B, - 0xC01C, - 0xC01D, - 0xC01E, - 0xC01F, - 0xC020, - 0xC021, - 0xC022, - 0xC023, - 0xC024, - 0xC027, - 0xC028, - 0xC02B, - 0xC02C, - 0xC02F, - 0xC030, - 0xC034, - 0xC035, - 0xC036, - 0xC037, - 0xC038, - 0xC072, - 0xC073, - 0xC076, - 0xC077, - 0xC07A, - 0xC07B, - 0xC07C, - 0xC07D, - 0xC080, - 0xC081, - 0xC084, - 0xC085, - 0xC086, - 0xC087, - 0xC08A, - 0xC08B, - 0xC08E, - 0xC08F, - 0xC090, - 0xC091, - 0xC094, - 0xC095, - 0xC096, - 0xC097, - 0xC09A, - 0xC09B, - 0xC09C, - 0xC09D, - 0xC09E, - 0xC09F, - 0xC0A0, - 0xC0A1, - 0xC0A2, - 0xC0A3, - 0xC0A4, - 0xC0A5, - 0xC0A6, - 0xC0A7, - 0xC0A8, - 0xC0A9, - 0xC0AA, - 0xC0AB, - 0xC0AC, - 0xC0AD, - 0xC0AE, - 0xC0AF, - 0xCC13, - 0xCC14, - 0xCC15, - 0xCCA8, - 0xCCA9, - 0xCCAA, - 0xCCAB, - 0xCCAC, - 0xCCAD, - 0xFFC0, - 0xFFC1, - 0xFFC2, - 0xFFC3, - 0xFFC4, - 0xFFC5, - 0xFFC6, - 0xFFC7, - 0xFFC8, - 0xFFC9, - 0xFFCA, - 0xFFCB, - }; -} - -Ciphersuite Ciphersuite::by_id(u16bit suite) - { - switch(suite) - { - case 0x000A: // RSA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x000A, "RSA", "RSA", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x0013: // DHE_DSS_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x0013, "DSA", "DH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x0016: // DHE_RSA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x0016, "RSA", "DH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x001B: // DH_anon_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x001B, "", "DH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x002F: // RSA_WITH_AES_128_CBC_SHA - return Ciphersuite(0x002F, "RSA", "RSA", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x0032: // DHE_DSS_WITH_AES_128_CBC_SHA - return Ciphersuite(0x0032, "DSA", "DH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x0033: // DHE_RSA_WITH_AES_128_CBC_SHA - return Ciphersuite(0x0033, "RSA", "DH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x0034: // DH_anon_WITH_AES_128_CBC_SHA - return Ciphersuite(0x0034, "", "DH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x0035: // RSA_WITH_AES_256_CBC_SHA - return Ciphersuite(0x0035, "RSA", "RSA", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x0038: // DHE_DSS_WITH_AES_256_CBC_SHA - return Ciphersuite(0x0038, "DSA", "DH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x0039: // DHE_RSA_WITH_AES_256_CBC_SHA - return Ciphersuite(0x0039, "RSA", "DH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x003A: // DH_anon_WITH_AES_256_CBC_SHA - return Ciphersuite(0x003A, "", "DH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x003C: // RSA_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x003C, "RSA", "RSA", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x003D: // RSA_WITH_AES_256_CBC_SHA256 - return Ciphersuite(0x003D, "RSA", "RSA", "AES-256", 32, 16, 0, "SHA-256", 32); - - case 0x0040: // DHE_DSS_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x0040, "DSA", "DH", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x0041: // RSA_WITH_CAMELLIA_128_CBC_SHA - return Ciphersuite(0x0041, "RSA", "RSA", "Camellia-128", 16, 16, 0, "SHA-1", 20); - - case 0x0044: // DHE_DSS_WITH_CAMELLIA_128_CBC_SHA - return Ciphersuite(0x0044, "DSA", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20); - - case 0x0045: // DHE_RSA_WITH_CAMELLIA_128_CBC_SHA - return Ciphersuite(0x0045, "RSA", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20); - - case 0x0046: // DH_anon_WITH_CAMELLIA_128_CBC_SHA - return Ciphersuite(0x0046, "", "DH", "Camellia-128", 16, 16, 0, "SHA-1", 20); - - case 0x0067: // DHE_RSA_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x0067, "RSA", "DH", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x006A: // DHE_DSS_WITH_AES_256_CBC_SHA256 - return Ciphersuite(0x006A, "DSA", "DH", "AES-256", 32, 16, 0, "SHA-256", 32); - - case 0x006B: // DHE_RSA_WITH_AES_256_CBC_SHA256 - return Ciphersuite(0x006B, "RSA", "DH", "AES-256", 32, 16, 0, "SHA-256", 32); - - case 0x006C: // DH_anon_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x006C, "", "DH", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x006D: // DH_anon_WITH_AES_256_CBC_SHA256 - return Ciphersuite(0x006D, "", "DH", "AES-256", 32, 16, 0, "SHA-256", 32); - - case 0x0084: // RSA_WITH_CAMELLIA_256_CBC_SHA - return Ciphersuite(0x0084, "RSA", "RSA", "Camellia-256", 32, 16, 0, "SHA-1", 20); - - case 0x0087: // DHE_DSS_WITH_CAMELLIA_256_CBC_SHA - return Ciphersuite(0x0087, "DSA", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20); - - case 0x0088: // DHE_RSA_WITH_CAMELLIA_256_CBC_SHA - return Ciphersuite(0x0088, "RSA", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20); - - case 0x0089: // DH_anon_WITH_CAMELLIA_256_CBC_SHA - return Ciphersuite(0x0089, "", "DH", "Camellia-256", 32, 16, 0, "SHA-1", 20); - - case 0x008B: // PSK_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x008B, "", "PSK", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x008C: // PSK_WITH_AES_128_CBC_SHA - return Ciphersuite(0x008C, "", "PSK", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x008D: // PSK_WITH_AES_256_CBC_SHA - return Ciphersuite(0x008D, "", "PSK", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x008F: // DHE_PSK_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0x008F, "", "DHE_PSK", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0x0090: // DHE_PSK_WITH_AES_128_CBC_SHA - return Ciphersuite(0x0090, "", "DHE_PSK", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0x0091: // DHE_PSK_WITH_AES_256_CBC_SHA - return Ciphersuite(0x0091, "", "DHE_PSK", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0x0096: // RSA_WITH_SEED_CBC_SHA - return Ciphersuite(0x0096, "RSA", "RSA", "SEED", 16, 16, 0, "SHA-1", 20); - - case 0x0099: // DHE_DSS_WITH_SEED_CBC_SHA - return Ciphersuite(0x0099, "DSA", "DH", "SEED", 16, 16, 0, "SHA-1", 20); - - case 0x009A: // DHE_RSA_WITH_SEED_CBC_SHA - return Ciphersuite(0x009A, "RSA", "DH", "SEED", 16, 16, 0, "SHA-1", 20); - - case 0x009B: // DH_anon_WITH_SEED_CBC_SHA - return Ciphersuite(0x009B, "", "DH", "SEED", 16, 16, 0, "SHA-1", 20); - - case 0x009C: // RSA_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x009C, "RSA", "RSA", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x009D: // RSA_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x009D, "RSA", "RSA", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x009E: // DHE_RSA_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x009E, "RSA", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x009F: // DHE_RSA_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x009F, "RSA", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x00A2: // DHE_DSS_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x00A2, "DSA", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x00A3: // DHE_DSS_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x00A3, "DSA", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x00A6: // DH_anon_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x00A6, "", "DH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x00A7: // DH_anon_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x00A7, "", "DH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x00A8: // PSK_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x00A8, "", "PSK", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x00A9: // PSK_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x00A9, "", "PSK", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x00AA: // DHE_PSK_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0x00AA, "", "DHE_PSK", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0x00AB: // DHE_PSK_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0x00AB, "", "DHE_PSK", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0x00AE: // PSK_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x00AE, "", "PSK", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x00AF: // PSK_WITH_AES_256_CBC_SHA384 - return Ciphersuite(0x00AF, "", "PSK", "AES-256", 32, 16, 0, "SHA-384", 48); - - case 0x00B2: // DHE_PSK_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0x00B2, "", "DHE_PSK", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0x00B3: // DHE_PSK_WITH_AES_256_CBC_SHA384 - return Ciphersuite(0x00B3, "", "DHE_PSK", "AES-256", 32, 16, 0, "SHA-384", 48); - - case 0x00BA: // RSA_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0x00BA, "RSA", "RSA", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0x00BD: // DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0x00BD, "DSA", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0x00BE: // DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0x00BE, "RSA", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0x00BF: // DH_anon_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0x00BF, "", "DH", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0x00C0: // RSA_WITH_CAMELLIA_256_CBC_SHA256 - return Ciphersuite(0x00C0, "RSA", "RSA", "Camellia-256", 32, 16, 0, "SHA-256", 32); - - case 0x00C3: // DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 - return Ciphersuite(0x00C3, "DSA", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32); - - case 0x00C4: // DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 - return Ciphersuite(0x00C4, "RSA", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32); - - case 0x00C5: // DH_anon_WITH_CAMELLIA_256_CBC_SHA256 - return Ciphersuite(0x00C5, "", "DH", "Camellia-256", 32, 16, 0, "SHA-256", 32); - - case 0xC008: // ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC008, "ECDSA", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC009: // ECDHE_ECDSA_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC009, "ECDSA", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC00A: // ECDHE_ECDSA_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC00A, "ECDSA", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC012: // ECDHE_RSA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC012, "RSA", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC013: // ECDHE_RSA_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC013, "RSA", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC014: // ECDHE_RSA_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC014, "RSA", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC017: // ECDH_anon_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC017, "", "ECDH", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC018: // ECDH_anon_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC018, "", "ECDH", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC019: // ECDH_anon_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC019, "", "ECDH", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC01A: // SRP_SHA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC01A, "", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC01B: // SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC01B, "RSA", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC01C: // SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC01C, "DSA", "SRP_SHA", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC01D: // SRP_SHA_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC01D, "", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC01E: // SRP_SHA_RSA_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC01E, "RSA", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC01F: // SRP_SHA_DSS_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC01F, "DSA", "SRP_SHA", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC020: // SRP_SHA_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC020, "", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC021: // SRP_SHA_RSA_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC021, "RSA", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC022: // SRP_SHA_DSS_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC022, "DSA", "SRP_SHA", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC023: // ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0xC023, "ECDSA", "ECDH", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0xC024: // ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - return Ciphersuite(0xC024, "ECDSA", "ECDH", "AES-256", 32, 16, 0, "SHA-384", 48); - - case 0xC027: // ECDHE_RSA_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0xC027, "RSA", "ECDH", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0xC028: // ECDHE_RSA_WITH_AES_256_CBC_SHA384 - return Ciphersuite(0xC028, "RSA", "ECDH", "AES-256", 32, 16, 0, "SHA-384", 48); - - case 0xC02B: // ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0xC02B, "ECDSA", "ECDH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC02C: // ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0xC02C, "ECDSA", "ECDH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC02F: // ECDHE_RSA_WITH_AES_128_GCM_SHA256 - return Ciphersuite(0xC02F, "RSA", "ECDH", "AES-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC030: // ECDHE_RSA_WITH_AES_256_GCM_SHA384 - return Ciphersuite(0xC030, "RSA", "ECDH", "AES-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC034: // ECDHE_PSK_WITH_3DES_EDE_CBC_SHA - return Ciphersuite(0xC034, "", "ECDHE_PSK", "3DES", 24, 8, 0, "SHA-1", 20); - - case 0xC035: // ECDHE_PSK_WITH_AES_128_CBC_SHA - return Ciphersuite(0xC035, "", "ECDHE_PSK", "AES-128", 16, 16, 0, "SHA-1", 20); - - case 0xC036: // ECDHE_PSK_WITH_AES_256_CBC_SHA - return Ciphersuite(0xC036, "", "ECDHE_PSK", "AES-256", 32, 16, 0, "SHA-1", 20); - - case 0xC037: // ECDHE_PSK_WITH_AES_128_CBC_SHA256 - return Ciphersuite(0xC037, "", "ECDHE_PSK", "AES-128", 16, 16, 0, "SHA-256", 32); - - case 0xC038: // ECDHE_PSK_WITH_AES_256_CBC_SHA384 - return Ciphersuite(0xC038, "", "ECDHE_PSK", "AES-256", 32, 16, 0, "SHA-384", 48); - - case 0xC072: // ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0xC072, "ECDSA", "ECDH", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0xC073: // ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 - return Ciphersuite(0xC073, "ECDSA", "ECDH", "Camellia-256", 32, 16, 0, "SHA-384", 48); - - case 0xC076: // ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0xC076, "RSA", "ECDH", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0xC077: // ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 - return Ciphersuite(0xC077, "RSA", "ECDH", "Camellia-256", 32, 16, 0, "SHA-384", 48); - - case 0xC07A: // RSA_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC07A, "RSA", "RSA", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC07B: // RSA_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC07B, "RSA", "RSA", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC07C: // DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC07C, "RSA", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC07D: // DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC07D, "RSA", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC080: // DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC080, "DSA", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC081: // DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC081, "DSA", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC084: // DH_anon_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC084, "", "DH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC085: // DH_anon_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC085, "", "DH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC086: // ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC086, "ECDSA", "ECDH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC087: // ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC087, "ECDSA", "ECDH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC08A: // ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC08A, "RSA", "ECDH", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC08B: // ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC08B, "RSA", "ECDH", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC08E: // PSK_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC08E, "", "PSK", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC08F: // PSK_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC08F, "", "PSK", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC090: // DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256 - return Ciphersuite(0xC090, "", "DHE_PSK", "Camellia-128/GCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC091: // DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384 - return Ciphersuite(0xC091, "", "DHE_PSK", "Camellia-256/GCM", 32, 4, 8, "AEAD", 0, "SHA-384"); - - case 0xC094: // PSK_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0xC094, "", "PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0xC095: // PSK_WITH_CAMELLIA_256_CBC_SHA384 - return Ciphersuite(0xC095, "", "PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48); - - case 0xC096: // DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0xC096, "", "DHE_PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0xC097: // DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - return Ciphersuite(0xC097, "", "DHE_PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48); - - case 0xC09A: // ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 - return Ciphersuite(0xC09A, "", "ECDHE_PSK", "Camellia-128", 16, 16, 0, "SHA-256", 32); - - case 0xC09B: // ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 - return Ciphersuite(0xC09B, "", "ECDHE_PSK", "Camellia-256", 32, 16, 0, "SHA-384", 48); - - case 0xC09C: // RSA_WITH_AES_128_CCM - return Ciphersuite(0xC09C, "RSA", "RSA", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC09D: // RSA_WITH_AES_256_CCM - return Ciphersuite(0xC09D, "RSA", "RSA", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC09E: // DHE_RSA_WITH_AES_128_CCM - return Ciphersuite(0xC09E, "RSA", "DH", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC09F: // DHE_RSA_WITH_AES_256_CCM - return Ciphersuite(0xC09F, "RSA", "DH", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A0: // RSA_WITH_AES_128_CCM_8 - return Ciphersuite(0xC0A0, "RSA", "RSA", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A1: // RSA_WITH_AES_256_CCM_8 - return Ciphersuite(0xC0A1, "RSA", "RSA", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A2: // DHE_RSA_WITH_AES_128_CCM_8 - return Ciphersuite(0xC0A2, "RSA", "DH", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A3: // DHE_RSA_WITH_AES_256_CCM_8 - return Ciphersuite(0xC0A3, "RSA", "DH", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A4: // PSK_WITH_AES_128_CCM - return Ciphersuite(0xC0A4, "", "PSK", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A5: // PSK_WITH_AES_256_CCM - return Ciphersuite(0xC0A5, "", "PSK", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A6: // DHE_PSK_WITH_AES_128_CCM - return Ciphersuite(0xC0A6, "", "DHE_PSK", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A7: // DHE_PSK_WITH_AES_256_CCM - return Ciphersuite(0xC0A7, "", "DHE_PSK", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A8: // PSK_WITH_AES_128_CCM_8 - return Ciphersuite(0xC0A8, "", "PSK", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0A9: // PSK_WITH_AES_256_CCM_8 - return Ciphersuite(0xC0A9, "", "PSK", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AA: // PSK_DHE_WITH_AES_128_CCM_8 - return Ciphersuite(0xC0AA, "", "DHE_PSK", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AB: // PSK_DHE_WITH_AES_256_CCM_8 - return Ciphersuite(0xC0AB, "", "DHE_PSK", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AC: // ECDHE_ECDSA_WITH_AES_128_CCM - return Ciphersuite(0xC0AC, "ECDSA", "ECDH", "AES-128/CCM", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AD: // ECDHE_ECDSA_WITH_AES_256_CCM - return Ciphersuite(0xC0AD, "ECDSA", "ECDH", "AES-256/CCM", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AE: // ECDHE_ECDSA_WITH_AES_128_CCM_8 - return Ciphersuite(0xC0AE, "ECDSA", "ECDH", "AES-128/CCM(8)", 16, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xC0AF: // ECDHE_ECDSA_WITH_AES_256_CCM_8 - return Ciphersuite(0xC0AF, "ECDSA", "ECDH", "AES-256/CCM(8)", 32, 4, 8, "AEAD", 0, "SHA-256"); - - case 0xCC13: // ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCC13, "RSA", "ECDH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"); - - case 0xCC14: // ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCC14, "ECDSA", "ECDH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"); - - case 0xCC15: // DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCC15, "RSA", "DH", "ChaCha20Poly1305", 32, 0, 0, "AEAD", 0, "SHA-256"); - - case 0xCCA8: // ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCA8, "RSA", "ECDH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xCCA9: // ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCA9, "ECDSA", "ECDH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xCCAA: // DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCAA, "RSA", "DH", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xCCAB: // PSK_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCAB, "", "PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xCCAC: // ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCAC, "", "ECDHE_PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xCCAD: // DHE_PSK_WITH_CHACHA20_POLY1305_SHA256 - return Ciphersuite(0xCCAD, "", "DHE_PSK", "ChaCha20Poly1305", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC0: // DHE_RSA_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFC0, "RSA", "DH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC1: // DHE_RSA_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFC1, "RSA", "DH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC2: // ECDHE_RSA_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFC2, "RSA", "ECDH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC3: // ECDHE_RSA_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFC3, "RSA", "ECDH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC4: // ECDHE_ECDSA_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFC4, "ECDSA", "ECDH", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC5: // ECDHE_ECDSA_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFC5, "ECDSA", "ECDH", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC6: // PSK_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFC6, "", "PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC7: // PSK_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFC7, "", "PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC8: // DHE_PSK_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFC8, "", "DHE_PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFC9: // DHE_PSK_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFC9, "", "DHE_PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFCA: // ECDHE_PSK_WITH_AES_128_OCB_SHA256 - return Ciphersuite(0xFFCA, "", "ECDHE_PSK", "AES-128/OCB(12)", 16, 12, 0, "AEAD", 0, "SHA-256"); - - case 0xFFCB: // ECDHE_PSK_WITH_AES_256_OCB_SHA256 - return Ciphersuite(0xFFCB, "", "ECDHE_PSK", "AES-256/OCB(12)", 32, 12, 0, "AEAD", 0, "SHA-256"); - - } - - return Ciphersuite(); // some unknown ciphersuite + // Note that this list of ciphersuites is ordered by id! + static const std::vector<Ciphersuite> 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(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(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(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"), + }; + + return g_ciphersuite_list; } } diff --git a/src/lib/utils/calendar.cpp b/src/lib/utils/calendar.cpp index 73602d634..2ed90486a 100644 --- a/src/lib/utils/calendar.cpp +++ b/src/lib/utils/calendar.cpp @@ -12,6 +12,7 @@ #include <sstream> #include <iomanip> #include <mutex> +#include <stdlib.h> #if defined(BOTAN_HAS_BOOST_DATETIME) #include <boost/date_time/posix_time/posix_time_types.hpp> @@ -39,7 +40,7 @@ std::tm do_gmtime(std::time_t time_val) return tm; } -#if !defined(BOTAN_TARGET_OS_HAS_TIMEGM) && !defined(BOTAN_TARGET_OS_HAS_MKGMTIME) +#if !defined(BOTAN_TARGET_OS_HAS_TIMEGM) && !(defined(BOTAN_TARGET_OS_HAS_MKGMTIME) && defined(BOTAN_BUILD_COMPILER_IS_MSVC)) #if defined(BOTAN_HAS_BOOST_DATETIME) @@ -67,7 +68,7 @@ std::time_t boost_timegm(std::tm *tm) return out; } -#else +#elif defined(BOTAN_OS_TYPE_IS_UNIX) #pragma message "Caution! A fallback version of timegm() is used which is not thread-safe" @@ -138,13 +139,15 @@ std::chrono::system_clock::time_point calendar_point::to_std_timepoint() const // Define a function alias `botan_timegm` #if defined(BOTAN_TARGET_OS_HAS_TIMEGM) std::time_t (&botan_timegm)(std::tm *tm) = timegm; - #elif defined(BOTAN_TARGET_OS_HAS_MKGMTIME) + #elif defined(BOTAN_TARGET_OS_HAS_MKGMTIME) && defined(BOTAN_BUILD_COMPILER_IS_MSVC) // http://stackoverflow.com/questions/16647819/timegm-cross-platform std::time_t (&botan_timegm)(std::tm *tm) = _mkgmtime; #elif defined(BOTAN_HAS_BOOST_DATETIME) std::time_t (&botan_timegm)(std::tm *tm) = boost_timegm; - #else + #elif defined(BOTAN_OS_TYPE_IS_UNIX) std::time_t (&botan_timegm)(std::tm *tm) = fallback_timegm; + #else + std::time_t (&botan_timegm)(std::tm *tm) = mktime; // localtime instead... #endif // Convert std::tm to std::time_t diff --git a/src/lib/utils/cpuid.cpp b/src/lib/utils/cpuid.cpp index 695a28550..d3def91ed 100644 --- a/src/lib/utils/cpuid.cpp +++ b/src/lib/utils/cpuid.cpp @@ -159,14 +159,12 @@ bool altivec_check_pvr_emul() bool CPUID::has_simd_32() { -#if defined(BOTAN_HAS_SIMD_SSE2) +#if defined(BOTAN_TARGET_SUPPORTS_SSE2) return CPUID::has_sse2(); -#elif defined(BOTAN_HAS_SIMD_ALTIVEC) +#elif defined(BOTAN_TARGET_SUPPORTS_ALTIVEC) return CPUID::has_altivec(); -#elif defined(BOTAN_HAS_SIMD_SCALAR) - return true; #else - return false; + return true; #endif } diff --git a/src/lib/utils/donna128.h b/src/lib/utils/donna128.h index c2a3e0d2e..2a2d1e339 100644 --- a/src/lib/utils/donna128.h +++ b/src/lib/utils/donna128.h @@ -23,18 +23,24 @@ class donna128 friend donna128 operator>>(const donna128& x, size_t shift) { donna128 z = x; - const u64bit carry = z.h << (64 - shift); - z.h = (z.h >> shift); - z.l = (z.l >> shift) | carry; + if(shift > 0) + { + const u64bit 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; - const u64bit carry = z.l >> (64 - shift); - z.l = (z.l << shift); - z.h = (z.h << shift) | carry; + if(shift > 0) + { + const u64bit carry = z.l >> (64 - shift); + z.l = (z.l << shift); + z.h = (z.h << shift) | carry; + } return z; } diff --git a/src/lib/utils/dyn_load/dyn_load.cpp b/src/lib/utils/dyn_load/dyn_load.cpp index c0795942b..ce6b61a1d 100644 --- a/src/lib/utils/dyn_load/dyn_load.cpp +++ b/src/lib/utils/dyn_load/dyn_load.cpp @@ -5,7 +5,7 @@ * Botan is released under the Simplified BSD License (see license.txt) */ -#include <botan/internal/dyn_load.h> +#include <botan/dyn_load.h> #include <botan/build.h> #include <botan/exceptn.h> diff --git a/src/lib/utils/dyn_load/dyn_load.h b/src/lib/utils/dyn_load/dyn_load.h index 7a9f4a83c..3a155f3de 100644 --- a/src/lib/utils/dyn_load/dyn_load.h +++ b/src/lib/utils/dyn_load/dyn_load.h @@ -9,13 +9,14 @@ #define BOTAN_DYNAMIC_LOADER_H__ #include <string> +#include <botan/build.h> namespace Botan { /** * Represents a DLL or shared object */ -class Dynamically_Loaded_Library +class BOTAN_DLL Dynamically_Loaded_Library { public: /** diff --git a/src/lib/utils/dyn_load/info.txt b/src/lib/utils/dyn_load/info.txt index 0cc4e4e73..22a79be43 100644 --- a/src/lib/utils/dyn_load/info.txt +++ b/src/lib/utils/dyn_load/info.txt @@ -1,4 +1,4 @@ -define DYNAMIC_LOADER 20131128 +define DYNAMIC_LOADER 20160310 load_on dep @@ -11,18 +11,12 @@ openbsd qnx solaris windows +darwin </os> <libs> android -> dl linux -> dl solaris -> dl +darwin -> dl </libs> - -<source> -dyn_load.cpp -</source> - -<header:internal> -dyn_load.h -</header:internal> diff --git a/src/lib/utils/exceptn.h b/src/lib/utils/exceptn.h index b6797f0f6..193d78ce9 100644 --- a/src/lib/utils/exceptn.h +++ b/src/lib/utils/exceptn.h @@ -215,6 +215,16 @@ struct BOTAN_DLL Self_Test_Failure : public Internal_Error {} }; +/** +* Not Implemented Exception +*/ +struct BOTAN_DLL Not_Implemented : public Exception + { + explicit Not_Implemented(const std::string& err) : + Exception("Not implemented", err) + {} + }; + } #endif diff --git a/src/lib/utils/filesystem.cpp b/src/lib/utils/filesystem.cpp index 8d51e64bd..c67668288 100644 --- a/src/lib/utils/filesystem.cpp +++ b/src/lib/utils/filesystem.cpp @@ -90,7 +90,7 @@ std::vector<std::string> impl_readdir(const std::string& dir_path) struct stat stat_buf; - if(::lstat(full_path.c_str(), &stat_buf) == -1) + if(::stat(full_path.c_str(), &stat_buf) == -1) continue; if(S_ISDIR(stat_buf.st_mode)) diff --git a/src/lib/utils/mul128.h b/src/lib/utils/mul128.h index bcf5fa7ef..fe533c720 100644 --- a/src/lib/utils/mul128.h +++ b/src/lib/utils/mul128.h @@ -12,13 +12,15 @@ namespace Botan { -// Prefer TI mode over __int128 as GCC rejects the latter in pendantic mode -#if (BOTAN_GCC_VERSION > 440) && defined(BOTAN_TARGET_CPU_HAS_NATIVE_64BIT) +#if defined(__SIZEOF_INT128__) && defined(BOTAN_TARGET_CPU_HAS_NATIVE_64BIT) #define BOTAN_TARGET_HAS_NATIVE_UINT128 - typedef unsigned int uint128_t __attribute__((mode(TI))); -#elif defined(__SIZEOF_INT128__) - #define BOTAN_TARGET_HAS_NATIVE_UINT128 - typedef unsigned __int128 uint128_t; + + // 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 } diff --git a/src/lib/utils/os_utils.cpp b/src/lib/utils/os_utils.cpp index 86776bdd0..eab509984 100644 --- a/src/lib/utils/os_utils.cpp +++ b/src/lib/utils/os_utils.cpp @@ -19,7 +19,7 @@ #include <unistd.h> #endif -#if defined(BOTAN_TARGET_OS_TYPE_IS_WINDOWS) +#if defined(BOTAN_TARGET_OS_IS_WINDOWS) || defined(BOTAN_TARGET_OS_IS_MINGW) #include <windows.h> #endif @@ -29,12 +29,12 @@ namespace OS { uint32_t get_process_id() { -#if defined(BOTAN_TARGET_OS_IS_UNIX) +#if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) return ::getpid(); -#elif defined(BOTAN_TARGET_OS_IS_WINDOWS) +#elif defined(BOTAN_TARGET_OS_IS_WINDOWS) || defined(BOTAN_TARGET_OS_IS_MINGW) return ::GetCurrentProcessId(); #else - return 0; + throw Exception("get_process_id not supported"); #endif } @@ -141,7 +141,7 @@ size_t get_memory_locking_limit() return std::min<size_t>(limits.rlim_cur, mlock_requested * 1024); } -#elif defined BOTAN_TARGET_OS_HAS_VIRTUAL_LOCK +#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)) diff --git a/src/lib/utils/os_utils.h b/src/lib/utils/os_utils.h index 3335463f7..590ed4ae7 100644 --- a/src/lib/utils/os_utils.h +++ b/src/lib/utils/os_utils.h @@ -15,7 +15,7 @@ namespace Botan { namespace OS { /** -* Returns the OS assigned process ID, if available. Otherwise returns 0. +* Returns the OS assigned process ID, if available. Otherwise throws. */ uint32_t get_process_id(); diff --git a/src/lib/utils/simd/info.txt b/src/lib/utils/simd/info.txt index 35620c940..6b9e381fa 100644 --- a/src/lib/utils/simd/info.txt +++ b/src/lib/utils/simd/info.txt @@ -3,7 +3,3 @@ define SIMD_32 20131128 <header:internal> simd_32.h </header:internal> - -<requires> -simd_sse2|simd_altivec|simd_scalar -</requires> diff --git a/src/lib/utils/simd/simd_32.h b/src/lib/utils/simd/simd_32.h index 265e347a9..c29c55c7a 100644 --- a/src/lib/utils/simd/simd_32.h +++ b/src/lib/utils/simd/simd_32.h @@ -1,6 +1,6 @@ /* * Lightweight wrappers for SIMD operations -* (C) 2009,2011 Jack Lloyd +* (C) 2009,2011,2016 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,22 +9,478 @@ #define BOTAN_SIMD_32_H__ #include <botan/types.h> +#include <botan/loadstor.h> +#include <botan/bswap.h> -#if defined(BOTAN_HAS_SIMD_SSE2) - #include <botan/internal/simd_sse2.h> - namespace Botan { typedef SIMD_SSE2 SIMD_32; } +#if defined(BOTAN_TARGET_SUPPORTS_SSE2) + #include <emmintrin.h> + #define BOTAN_SIMD_USE_SSE2 -#elif defined(BOTAN_HAS_SIMD_ALTIVEC) - #include <botan/internal/simd_altivec.h> - namespace Botan { typedef SIMD_Altivec SIMD_32; } +#elif defined(BOTAN_TARGET_SUPPORTS_ALTIVEC) + #include <altivec.h> + #undef vector + #undef bool + #define BOTAN_SIMD_USE_ALTIVEC +#endif + +// TODO: NEON support + +namespace Botan { + +/** +* 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. +*/ +class SIMD_4x32 + { + public: + + SIMD_4x32() // zero initialized + { +#if defined(BOTAN_SIMD_USE_SSE2) || defined(BOTAN_SIMD_USE_ALTIVEC) + ::memset(&m_reg, 0, sizeof(m_reg)); +#else + ::memset(m_reg, 0, sizeof(m_reg)); +#endif + } + + explicit SIMD_4x32(const u32bit B[4]) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_loadu_si128(reinterpret_cast<const __m128i*>(B)); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = (__vector unsigned int){B[0], B[1], B[2], B[3]}; +#else + m_reg[0] = B[0]; + m_reg[1] = B[1]; + m_reg[2] = B[2]; + m_reg[3] = B[3]; +#endif + } + + SIMD_4x32(u32bit B0, u32bit B1, u32bit B2, u32bit B3) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_set_epi32(B0, B1, B2, B3); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = (__vector unsigned int){B0, B1, B2, B3}; +#else + m_reg[0] = B0; + m_reg[1] = B1; + m_reg[2] = B2; + m_reg[3] = B3; +#endif + } + + explicit SIMD_4x32(u32bit B) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_set1_epi32(B); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = (__vector unsigned int){B, B, B, B}; +#else + m_reg[0] = B; + m_reg[1] = B; + m_reg[2] = B; + m_reg[3] = B; +#endif + } + + static SIMD_4x32 load_le(const void* in) + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_loadu_si128(reinterpret_cast<const __m128i*>(in))); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + const u32bit* in_32 = static_cast<const u32bit*>(in); + + __vector unsigned int R0 = vec_ld(0, in_32); + __vector unsigned int R1 = vec_ld(12, in_32); -#elif defined(BOTAN_HAS_SIMD_SCALAR) - #include <botan/internal/simd_scalar.h> - namespace Botan { typedef SIMD_Scalar<u32bit,4> SIMD_32; } + __vector unsigned char perm = vec_lvsl(0, in_32); +#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) + perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector +#endif + + R0 = vec_perm(R0, R1, perm); + + return SIMD_4x32(R0); #else - #error "No SIMD module defined" + SIMD_4x32 out; + Botan::load_le(out.m_reg, static_cast<const uint8_t*>(in), 4); + return out; +#endif + } + 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 u32bit* in_32 = static_cast<const u32bit*>(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 defined(BOTAN_TARGET_CPU_IS_LITTLE_ENDIAN) + perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector #endif + R0 = vec_perm(R0, R1, perm); + + return SIMD_4x32(R0); + +#else + SIMD_4x32 out; + Botan::load_be(out.m_reg, static_cast<const uint8_t*>(in), 4); + return out; +#endif + } + + void store_le(uint8_t out[]) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + _mm_storeu_si128(reinterpret_cast<__m128i*>(out), m_reg); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + __vector unsigned char perm = vec_lvsl(0, static_cast<u32bit*>(nullptr)); + +#if defined(BOTAN_TARGET_CPU_IS_BIG_ENDIAN) + perm = vec_xor(perm, vec_splat_u8(3)); // bswap vector +#endif + + union { + __vector unsigned int V; + u32bit R[4]; + } vec; + + vec.V = vec_perm(m_reg, m_reg, perm); + + Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); +#else + Botan::store_le(out, m_reg[0], m_reg[1], m_reg[2], m_reg[3]); +#endif + } + + 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; + u32bit R[4]; + } vec; + + vec.V = m_reg; + + Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); +#else + Botan::store_be(out, m_reg[0], m_reg[1], m_reg[2], m_reg[3]); +#endif + } + + void rotate_left(size_t rot) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_or_si128(_mm_slli_epi32(m_reg, static_cast<int>(rot)), + _mm_srli_epi32(m_reg, static_cast<int>(32-rot))); + +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + const unsigned int r = static_cast<unsigned int>(rot); + m_reg = vec_rl(m_reg, (__vector unsigned int){r, r, r, r}); + +#else + m_reg[0] = Botan::rotate_left(m_reg[0], rot); + m_reg[1] = Botan::rotate_left(m_reg[1], rot); + m_reg[2] = Botan::rotate_left(m_reg[2], rot); + m_reg[3] = Botan::rotate_left(m_reg[3], rot); +#endif + } + + void rotate_right(size_t rot) + { + rotate_left(32 - rot); + } + + void operator+=(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_add_epi32(m_reg, other.m_reg); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = vec_add(m_reg, other.m_reg); +#else + m_reg[0] += other.m_reg[0]; + m_reg[1] += other.m_reg[1]; + m_reg[2] += other.m_reg[2]; + m_reg[3] += other.m_reg[3]; +#endif + } + + SIMD_4x32 operator+(const SIMD_4x32& other) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_add_epi32(m_reg, other.m_reg)); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + return SIMD_4x32(vec_add(m_reg, other.m_reg)); +#else + return SIMD_4x32(m_reg[0] + other.m_reg[0], + m_reg[1] + other.m_reg[1], + m_reg[2] + other.m_reg[2], + m_reg[3] + other.m_reg[3]); +#endif + } + + void operator-=(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_sub_epi32(m_reg, other.m_reg); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = vec_sub(m_reg, other.m_reg); +#else + m_reg[0] -= other.m_reg[0]; + m_reg[1] -= other.m_reg[1]; + m_reg[2] -= other.m_reg[2]; + m_reg[3] -= other.m_reg[3]; +#endif + } + + SIMD_4x32 operator-(const SIMD_4x32& other) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_sub_epi32(m_reg, other.m_reg)); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + return SIMD_4x32(vec_sub(m_reg, other.m_reg)); +#else + return SIMD_4x32(m_reg[0] - other.m_reg[0], + m_reg[1] - other.m_reg[1], + m_reg[2] - other.m_reg[2], + m_reg[3] - other.m_reg[3]); +#endif + } + + void operator^=(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_xor_si128(m_reg, other.m_reg); + +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = vec_xor(m_reg, other.m_reg); +#else + m_reg[0] ^= other.m_reg[0]; + m_reg[1] ^= other.m_reg[1]; + m_reg[2] ^= other.m_reg[2]; + m_reg[3] ^= other.m_reg[3]; +#endif + } + + SIMD_4x32 operator^(const SIMD_4x32& other) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_xor_si128(m_reg, other.m_reg)); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + return SIMD_4x32(vec_xor(m_reg, other.m_reg)); +#else + return SIMD_4x32(m_reg[0] ^ other.m_reg[0], + m_reg[1] ^ other.m_reg[1], + m_reg[2] ^ other.m_reg[2], + m_reg[3] ^ other.m_reg[3]); +#endif + } + + void operator|=(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_or_si128(m_reg, other.m_reg); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = vec_or(m_reg, other.m_reg); +#else + m_reg[0] |= other.m_reg[0]; + m_reg[1] |= other.m_reg[1]; + m_reg[2] |= other.m_reg[2]; + m_reg[3] |= other.m_reg[3]; +#endif + } + + SIMD_4x32 operator&(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_and_si128(m_reg, other.m_reg)); + +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + return SIMD_4x32(vec_and(m_reg, other.m_reg)); +#else + return SIMD_4x32(m_reg[0] & other.m_reg[0], + m_reg[1] & other.m_reg[1], + m_reg[2] & other.m_reg[2], + m_reg[3] & other.m_reg[3]); +#endif + } + + void operator&=(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + m_reg = _mm_and_si128(m_reg, other.m_reg); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + m_reg = vec_and(m_reg, other.m_reg); +#else + m_reg[0] &= other.m_reg[0]; + m_reg[1] &= other.m_reg[1]; + m_reg[2] &= other.m_reg[2]; + m_reg[3] &= other.m_reg[3]; +#endif + } + + SIMD_4x32 operator<<(size_t shift) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_slli_epi32(m_reg, static_cast<int>(shift))); + +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + const unsigned int s = static_cast<unsigned int>(shift); + return SIMD_4x32(vec_sl(m_reg, (__vector unsigned int){s, s, s, s})); +#else + return SIMD_4x32(m_reg[0] << shift, + m_reg[1] << shift, + m_reg[2] << shift, + m_reg[3] << shift); +#endif + } + + SIMD_4x32 operator>>(size_t shift) const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_srli_epi32(m_reg, static_cast<int>(shift))); + +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + const unsigned int s = static_cast<unsigned int>(shift); + return SIMD_4x32(vec_sr(m_reg, (__vector unsigned int){s, s, s, s})); +#else + return SIMD_4x32(m_reg[0] >> shift, + m_reg[1] >> shift, + m_reg[2] >> shift, + m_reg[3] >> shift); + +#endif + } + + SIMD_4x32 operator~() const + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_xor_si128(m_reg, _mm_set1_epi32(0xFFFFFFFF))); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + return SIMD_4x32(vec_nor(m_reg, m_reg)); +#else + return SIMD_4x32(~m_reg[0], + ~m_reg[1], + ~m_reg[2], + ~m_reg[3]); +#endif + } + + // (~reg) & other + SIMD_4x32 andc(const SIMD_4x32& other) + { +#if defined(BOTAN_SIMD_USE_SSE2) + return SIMD_4x32(_mm_andnot_si128(m_reg, other.m_reg)); +#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_reg, m_reg)); +#else + return SIMD_4x32((~m_reg[0]) & other.m_reg[0], + (~m_reg[1]) & other.m_reg[1], + (~m_reg[2]) & other.m_reg[2], + (~m_reg[3]) & other.m_reg[3]); +#endif + } + + SIMD_4x32 bswap() const + { +#if defined(BOTAN_SIMD_USE_SSE2) + __m128i T = m_reg; + + 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<u32bit*>(nullptr)); + + perm = vec_xor(perm, vec_splat_u8(3)); + + return SIMD_4x32(vec_perm(m_reg, m_reg, perm)); +#else + return SIMD_4x32(reverse_bytes(m_reg[0]), + reverse_bytes(m_reg[1]), + reverse_bytes(m_reg[2]), + reverse_bytes(m_reg[3])); +#endif + } + + static void transpose(SIMD_4x32& B0, SIMD_4x32& B1, + SIMD_4x32& B2, SIMD_4x32& B3) + { +#if defined(BOTAN_SIMD_USE_SSE2) + __m128i T0 = _mm_unpacklo_epi32(B0.m_reg, B1.m_reg); + __m128i T1 = _mm_unpacklo_epi32(B2.m_reg, B3.m_reg); + __m128i T2 = _mm_unpackhi_epi32(B0.m_reg, B1.m_reg); + __m128i T3 = _mm_unpackhi_epi32(B2.m_reg, B3.m_reg); + B0.m_reg = _mm_unpacklo_epi64(T0, T1); + B1.m_reg = _mm_unpackhi_epi64(T0, T1); + B2.m_reg = _mm_unpacklo_epi64(T2, T3); + B3.m_reg = _mm_unpackhi_epi64(T2, T3); +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + __vector unsigned int T0 = vec_mergeh(B0.m_reg, B2.m_reg); + __vector unsigned int T1 = vec_mergel(B0.m_reg, B2.m_reg); + __vector unsigned int T2 = vec_mergeh(B1.m_reg, B3.m_reg); + __vector unsigned int T3 = vec_mergel(B1.m_reg, B3.m_reg); + + B0.m_reg = vec_mergeh(T0, T2); + B1.m_reg = vec_mergel(T0, T2); + B2.m_reg = vec_mergeh(T1, T3); + B3.m_reg = vec_mergel(T1, T3); +#else + SIMD_4x32 T0(B0.m_reg[0], B1.m_reg[0], B2.m_reg[0], B3.m_reg[0]); + SIMD_4x32 T1(B0.m_reg[1], B1.m_reg[1], B2.m_reg[1], B3.m_reg[1]); + SIMD_4x32 T2(B0.m_reg[2], B1.m_reg[2], B2.m_reg[2], B3.m_reg[2]); + SIMD_4x32 T3(B0.m_reg[3], B1.m_reg[3], B2.m_reg[3], B3.m_reg[3]); + + B0 = T0; + B1 = T1; + B2 = T2; + B3 = T3; +#endif + } + + private: +#if defined(BOTAN_SIMD_USE_SSE2) + explicit SIMD_4x32(__m128i in) { m_reg = in; } +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + explicit SIMD_4x32(__vector unsigned int input) { m_reg = input; } +#endif + +#if defined(BOTAN_SIMD_USE_SSE2) + __m128i m_reg; +#elif defined(BOTAN_SIMD_USE_ALTIVEC) + __vector unsigned int m_reg; +#else + uint32_t m_reg[4]; +#endif + }; + +typedef SIMD_4x32 SIMD_32; + +} + #endif diff --git a/src/lib/utils/simd/simd_altivec/info.txt b/src/lib/utils/simd/simd_altivec/info.txt deleted file mode 100644 index 19168a928..000000000 --- a/src/lib/utils/simd/simd_altivec/info.txt +++ /dev/null @@ -1,9 +0,0 @@ -define SIMD_ALTIVEC 20131128 - -need_isa altivec - -load_on dep - -<header:internal> -simd_altivec.h -</header:internal> diff --git a/src/lib/utils/simd/simd_altivec/simd_altivec.h b/src/lib/utils/simd/simd_altivec/simd_altivec.h deleted file mode 100644 index 3963f2817..000000000 --- a/src/lib/utils/simd/simd_altivec/simd_altivec.h +++ /dev/null @@ -1,213 +0,0 @@ -/* -* Lightweight wrappers around AltiVec for 32-bit operations -* (C) 2009 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_SIMD_ALTIVEC_H__ -#define BOTAN_SIMD_ALTIVEC_H__ - -#if defined(BOTAN_TARGET_SUPPORTS_ALTIVEC) - -#include <botan/loadstor.h> -#include <botan/cpuid.h> - -#include <altivec.h> -#undef vector -#undef bool - -namespace Botan { - -class SIMD_Altivec - { - public: - SIMD_Altivec(const u32bit B[4]) - { - m_reg = (__vector unsigned int){B[0], B[1], B[2], B[3]}; - } - - SIMD_Altivec(u32bit B0, u32bit B1, u32bit B2, u32bit B3) - { - m_reg = (__vector unsigned int){B0, B1, B2, B3}; - } - - SIMD_Altivec(u32bit B) - { - m_reg = (__vector unsigned int){B, B, B, B}; - } - - static SIMD_Altivec load_le(const void* in) - { - const u32bit* in_32 = static_cast<const u32bit*>(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); - - perm = vec_xor(perm, vec_splat_u8(3)); - - R0 = vec_perm(R0, R1, perm); - - return SIMD_Altivec(R0); - } - - static SIMD_Altivec load_be(const void* in) - { - const u32bit* in_32 = static_cast<const u32bit*>(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); - - R0 = vec_perm(R0, R1, perm); - - return SIMD_Altivec(R0); - } - - void store_le(byte out[]) const - { - __vector unsigned char perm = vec_lvsl(0, static_cast<u32bit*>(nullptr)); - - perm = vec_xor(perm, vec_splat_u8(3)); - - union { - __vector unsigned int V; - u32bit R[4]; - } vec; - - vec.V = vec_perm(m_reg, m_reg, perm); - - Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); - } - - void store_be(byte out[]) const - { - union { - __vector unsigned int V; - u32bit R[4]; - } vec; - - vec.V = m_reg; - - Botan::store_be(out, vec.R[0], vec.R[1], vec.R[2], vec.R[3]); - } - - void rotate_left(size_t rot) - { - const unsigned int r = static_cast<unsigned int>(rot); - m_reg = vec_rl(m_reg, (__vector unsigned int){r, r, r, r}); - } - - void rotate_right(size_t rot) - { - rotate_left(32 - rot); - } - - void operator+=(const SIMD_Altivec& other) - { - m_reg = vec_add(m_reg, other.m_reg); - } - - SIMD_Altivec operator+(const SIMD_Altivec& other) const - { - return vec_add(m_reg, other.m_reg); - } - - void operator-=(const SIMD_Altivec& other) - { - m_reg = vec_sub(m_reg, other.m_reg); - } - - SIMD_Altivec operator-(const SIMD_Altivec& other) const - { - return vec_sub(m_reg, other.m_reg); - } - - void operator^=(const SIMD_Altivec& other) - { - m_reg = vec_xor(m_reg, other.m_reg); - } - - SIMD_Altivec operator^(const SIMD_Altivec& other) const - { - return vec_xor(m_reg, other.m_reg); - } - - void operator|=(const SIMD_Altivec& other) - { - m_reg = vec_or(m_reg, other.m_reg); - } - - SIMD_Altivec operator&(const SIMD_Altivec& other) - { - return vec_and(m_reg, other.m_reg); - } - - void operator&=(const SIMD_Altivec& other) - { - m_reg = vec_and(m_reg, other.m_reg); - } - - SIMD_Altivec operator<<(size_t shift) const - { - const unsigned int s = static_cast<unsigned int>(shift); - return vec_sl(m_reg, (__vector unsigned int){s, s, s, s}); - } - - SIMD_Altivec operator>>(size_t shift) const - { - const unsigned int s = static_cast<unsigned int>(shift); - return vec_sr(m_reg, (__vector unsigned int){s, s, s, s}); - } - - SIMD_Altivec operator~() const - { - return vec_nor(m_reg, m_reg); - } - - SIMD_Altivec andc(const SIMD_Altivec& other) - { - /* - AltiVec does arg1 & ~arg2 rather than SSE's ~arg1 & arg2 - so swap the arguments - */ - return vec_andc(other.m_reg, m_reg); - } - - SIMD_Altivec bswap() const - { - __vector unsigned char perm = vec_lvsl(0, static_cast<u32bit*>(nullptr)); - - perm = vec_xor(perm, vec_splat_u8(3)); - - return SIMD_Altivec(vec_perm(m_reg, m_reg, perm)); - } - - static void transpose(SIMD_Altivec& B0, SIMD_Altivec& B1, - SIMD_Altivec& B2, SIMD_Altivec& B3) - { - __vector unsigned int T0 = vec_mergeh(B0.m_reg, B2.m_reg); - __vector unsigned int T1 = vec_mergel(B0.m_reg, B2.m_reg); - __vector unsigned int T2 = vec_mergeh(B1.m_reg, B3.m_reg); - __vector unsigned int T3 = vec_mergel(B1.m_reg, B3.m_reg); - - B0.m_reg = vec_mergeh(T0, T2); - B1.m_reg = vec_mergel(T0, T2); - B2.m_reg = vec_mergeh(T1, T3); - B3.m_reg = vec_mergel(T1, T3); - } - - private: - SIMD_Altivec(__vector unsigned int input) { m_reg = input; } - - __vector unsigned int m_reg; - }; - -} - -#endif - -#endif diff --git a/src/lib/utils/simd/simd_scalar/info.txt b/src/lib/utils/simd/simd_scalar/info.txt deleted file mode 100644 index 26a9fbfee..000000000 --- a/src/lib/utils/simd/simd_scalar/info.txt +++ /dev/null @@ -1,7 +0,0 @@ -define SIMD_SCALAR 20131128 - -load_on dep - -<header:internal> -simd_scalar.h -</header:internal> diff --git a/src/lib/utils/simd/simd_scalar/simd_scalar.h b/src/lib/utils/simd/simd_scalar/simd_scalar.h deleted file mode 100644 index 28d72c615..000000000 --- a/src/lib/utils/simd/simd_scalar/simd_scalar.h +++ /dev/null @@ -1,213 +0,0 @@ -/* -* Scalar emulation of SIMD -* (C) 2009,2013 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_SIMD_SCALAR_H__ -#define BOTAN_SIMD_SCALAR_H__ - -#include <botan/loadstor.h> -#include <botan/bswap.h> - -namespace Botan { - -/** -* Fake SIMD, using plain scalar operations -* Often still faster than iterative on superscalar machines -*/ -template<typename T, size_t N> -class SIMD_Scalar - { - public: - static size_t size() { return N; } - - SIMD_Scalar() { /* uninitialized */ } - - SIMD_Scalar(const T B[N]) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] = B[i]; - } - - SIMD_Scalar(T B) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] = B; - } - - static SIMD_Scalar<T,N> load_le(const void* in) - { - SIMD_Scalar<T,N> out; - const byte* in_b = static_cast<const byte*>(in); - - for(size_t i = 0; i != size(); ++i) - out.m_v[i] = Botan::load_le<T>(in_b, i); - - return out; - } - - static SIMD_Scalar<T,N> load_be(const void* in) - { - SIMD_Scalar<T,N> out; - const byte* in_b = static_cast<const byte*>(in); - - for(size_t i = 0; i != size(); ++i) - out.m_v[i] = Botan::load_be<T>(in_b, i); - - return out; - } - - void store_le(byte out[]) const - { - for(size_t i = 0; i != size(); ++i) - Botan::store_le(m_v[i], out + i*sizeof(T)); - } - - void store_be(byte out[]) const - { - for(size_t i = 0; i != size(); ++i) - Botan::store_be(m_v[i], out + i*sizeof(T)); - } - - void rotate_left(size_t rot) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] = Botan::rotate_left(m_v[i], rot); - } - - void rotate_right(size_t rot) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] = Botan::rotate_right(m_v[i], rot); - } - - void operator+=(const SIMD_Scalar<T,N>& other) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] += other.m_v[i]; - } - - void operator-=(const SIMD_Scalar<T,N>& other) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] -= other.m_v[i]; - } - - SIMD_Scalar<T,N> operator+(const SIMD_Scalar<T,N>& other) const - { - SIMD_Scalar<T,N> out = *this; - out += other; - return out; - } - - SIMD_Scalar<T,N> operator-(const SIMD_Scalar<T,N>& other) const - { - SIMD_Scalar<T,N> out = *this; - out -= other; - return out; - } - - void operator^=(const SIMD_Scalar<T,N>& other) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] ^= other.m_v[i]; - } - - SIMD_Scalar<T,N> operator^(const SIMD_Scalar<T,N>& other) const - { - SIMD_Scalar<T,N> out = *this; - out ^= other; - return out; - } - - void operator|=(const SIMD_Scalar<T,N>& other) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] |= other.m_v[i]; - } - - void operator&=(const SIMD_Scalar<T,N>& other) - { - for(size_t i = 0; i != size(); ++i) - m_v[i] &= other.m_v[i]; - } - - SIMD_Scalar<T,N> operator&(const SIMD_Scalar<T,N>& other) - { - SIMD_Scalar<T,N> out = *this; - out &= other; - return out; - } - - SIMD_Scalar<T,N> operator<<(size_t shift) const - { - SIMD_Scalar<T,N> out = *this; - for(size_t i = 0; i != size(); ++i) - out.m_v[i] <<= shift; - return out; - } - - SIMD_Scalar<T,N> operator>>(size_t shift) const - { - SIMD_Scalar<T,N> out = *this; - for(size_t i = 0; i != size(); ++i) - out.m_v[i] >>= shift; - return out; - } - - SIMD_Scalar<T,N> operator~() const - { - SIMD_Scalar<T,N> out = *this; - for(size_t i = 0; i != size(); ++i) - out.m_v[i] = ~out.m_v[i]; - return out; - } - - // (~reg) & other - SIMD_Scalar<T,N> andc(const SIMD_Scalar<T,N>& other) - { - SIMD_Scalar<T,N> out; - for(size_t i = 0; i != size(); ++i) - out.m_v[i] = (~m_v[i]) & other.m_v[i]; - return out; - } - - SIMD_Scalar<T,N> bswap() const - { - SIMD_Scalar<T,N> out; - for(size_t i = 0; i != size(); ++i) - out.m_v[i] = reverse_bytes(m_v[i]); - return out; - } - - static void transpose(SIMD_Scalar<T,N>& B0, SIMD_Scalar<T,N>& B1, - SIMD_Scalar<T,N>& B2, SIMD_Scalar<T,N>& B3) - { - static_assert(N == 4, "4x4 transpose"); - SIMD_Scalar<T,N> T0({B0.m_v[0], B1.m_v[0], B2.m_v[0], B3.m_v[0]}); - SIMD_Scalar<T,N> T1({B0.m_v[1], B1.m_v[1], B2.m_v[1], B3.m_v[1]}); - SIMD_Scalar<T,N> T2({B0.m_v[2], B1.m_v[2], B2.m_v[2], B3.m_v[2]}); - SIMD_Scalar<T,N> T3({B0.m_v[3], B1.m_v[3], B2.m_v[3], B3.m_v[3]}); - - B0 = T0; - B1 = T1; - B2 = T2; - B3 = T3; - } - - private: - SIMD_Scalar(std::initializer_list<T> B) - { - size_t i = 0; - for(auto v = B.begin(); v != B.end(); ++v) - m_v[i++] = *v; - } - - T m_v[N]; - }; - -} - -#endif diff --git a/src/lib/utils/simd/simd_sse2/info.txt b/src/lib/utils/simd/simd_sse2/info.txt deleted file mode 100644 index bd9e430cb..000000000 --- a/src/lib/utils/simd/simd_sse2/info.txt +++ /dev/null @@ -1,9 +0,0 @@ -define SIMD_SSE2 20131128 - -need_isa sse2 - -load_on dep - -<header:internal> -simd_sse2.h -</header:internal> diff --git a/src/lib/utils/simd/simd_sse2/simd_sse2.h b/src/lib/utils/simd/simd_sse2/simd_sse2.h deleted file mode 100644 index 551e9189c..000000000 --- a/src/lib/utils/simd/simd_sse2/simd_sse2.h +++ /dev/null @@ -1,167 +0,0 @@ -/* -* Lightweight wrappers for SSE2 intrinsics for 32-bit operations -* (C) 2009 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#ifndef BOTAN_SIMD_SSE_H__ -#define BOTAN_SIMD_SSE_H__ - -#if defined(BOTAN_TARGET_SUPPORTS_SSE2) - -#include <botan/cpuid.h> -#include <emmintrin.h> - -namespace Botan { - -class SIMD_SSE2 - { - public: - explicit SIMD_SSE2(const u32bit B[4]) - { - m_reg = _mm_loadu_si128(reinterpret_cast<const __m128i*>(B)); - } - - SIMD_SSE2(u32bit B0, u32bit B1, u32bit B2, u32bit B3) - { - m_reg = _mm_set_epi32(B0, B1, B2, B3); - } - - explicit SIMD_SSE2(u32bit B) - { - m_reg = _mm_set1_epi32(B); - } - - static SIMD_SSE2 load_le(const void* in) - { - return SIMD_SSE2(_mm_loadu_si128(reinterpret_cast<const __m128i*>(in))); - } - - static SIMD_SSE2 load_be(const void* in) - { - return load_le(in).bswap(); - } - - void store_le(byte out[]) const - { - _mm_storeu_si128(reinterpret_cast<__m128i*>(out), m_reg); - } - - void store_be(byte out[]) const - { - bswap().store_le(out); - } - - void rotate_left(size_t rot) - { - m_reg = _mm_or_si128(_mm_slli_epi32(m_reg, static_cast<int>(rot)), - _mm_srli_epi32(m_reg, static_cast<int>(32-rot))); - } - - void rotate_right(size_t rot) - { - rotate_left(32 - rot); - } - - void operator+=(const SIMD_SSE2& other) - { - m_reg = _mm_add_epi32(m_reg, other.m_reg); - } - - SIMD_SSE2 operator+(const SIMD_SSE2& other) const - { - return SIMD_SSE2(_mm_add_epi32(m_reg, other.m_reg)); - } - - void operator-=(const SIMD_SSE2& other) - { - m_reg = _mm_sub_epi32(m_reg, other.m_reg); - } - - SIMD_SSE2 operator-(const SIMD_SSE2& other) const - { - return SIMD_SSE2(_mm_sub_epi32(m_reg, other.m_reg)); - } - - void operator^=(const SIMD_SSE2& other) - { - m_reg = _mm_xor_si128(m_reg, other.m_reg); - } - - SIMD_SSE2 operator^(const SIMD_SSE2& other) const - { - return SIMD_SSE2(_mm_xor_si128(m_reg, other.m_reg)); - } - - void operator|=(const SIMD_SSE2& other) - { - m_reg = _mm_or_si128(m_reg, other.m_reg); - } - - SIMD_SSE2 operator&(const SIMD_SSE2& other) - { - return SIMD_SSE2(_mm_and_si128(m_reg, other.m_reg)); - } - - void operator&=(const SIMD_SSE2& other) - { - m_reg = _mm_and_si128(m_reg, other.m_reg); - } - - SIMD_SSE2 operator<<(size_t shift) const - { - return SIMD_SSE2(_mm_slli_epi32(m_reg, static_cast<int>(shift))); - } - - SIMD_SSE2 operator>>(size_t shift) const - { - return SIMD_SSE2(_mm_srli_epi32(m_reg, static_cast<int>(shift))); - } - - SIMD_SSE2 operator~() const - { - return SIMD_SSE2(_mm_xor_si128(m_reg, _mm_set1_epi32(0xFFFFFFFF))); - } - - // (~reg) & other - SIMD_SSE2 andc(const SIMD_SSE2& other) - { - return SIMD_SSE2(_mm_andnot_si128(m_reg, other.m_reg)); - } - - SIMD_SSE2 bswap() const - { - __m128i T = m_reg; - - T = _mm_shufflehi_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); - T = _mm_shufflelo_epi16(T, _MM_SHUFFLE(2, 3, 0, 1)); - - return SIMD_SSE2(_mm_or_si128(_mm_srli_epi16(T, 8), - _mm_slli_epi16(T, 8))); - } - - static void transpose(SIMD_SSE2& B0, SIMD_SSE2& B1, - SIMD_SSE2& B2, SIMD_SSE2& B3) - { - __m128i T0 = _mm_unpacklo_epi32(B0.m_reg, B1.m_reg); - __m128i T1 = _mm_unpacklo_epi32(B2.m_reg, B3.m_reg); - __m128i T2 = _mm_unpackhi_epi32(B0.m_reg, B1.m_reg); - __m128i T3 = _mm_unpackhi_epi32(B2.m_reg, B3.m_reg); - B0.m_reg = _mm_unpacklo_epi64(T0, T1); - B1.m_reg = _mm_unpackhi_epi64(T0, T1); - B2.m_reg = _mm_unpacklo_epi64(T2, T3); - B3.m_reg = _mm_unpackhi_epi64(T2, T3); - } - - private: - explicit SIMD_SSE2(__m128i in) { m_reg = in; } - - __m128i m_reg; - }; - -} - -#endif - -#endif diff --git a/src/lib/utils/zero_mem.cpp b/src/lib/utils/zero_mem.cpp index 371c434ca..df195048a 100644 --- a/src/lib/utils/zero_mem.cpp +++ b/src/lib/utils/zero_mem.cpp @@ -18,6 +18,13 @@ void zero_mem(void* ptr, size_t n) #if defined(BOTAN_TARGET_OS_HAS_RTLSECUREZEROMEMORY) ::RtlSecureZeroMemory(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 diff --git a/src/python/botan.py b/src/python/botan.py index 6e5f457b3..093359970 100755 --- a/src/python/botan.py +++ b/src/python/botan.py @@ -342,11 +342,11 @@ def pbkdf_timed(algo, password, out_len, ms_to_run = 300, salt = rng().get(12)): """ KDF """ -def kdf(algo, secret, out_len, salt): - 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] +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)) + 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] """ @@ -699,7 +699,7 @@ def test(): def test_kdf(): print("KDF2(SHA-1) %s" % hex_encode(kdf('KDF2(SHA-1)', hex_decode('701F3480DFE95F57941F804B1B2413EF'), 7, - hex_decode('55A4E9DD5F4CA2EF82')))) + hex_decode('55A4E9DD5F4CA2EF82'), hex_decode('')))) def test_pbkdf(): print("PBKDF2(SHA-1) %s" % diff --git a/src/scripts/ci/appveyor.yml b/src/scripts/ci/appveyor.yml index 58e04eea9..29100e415 100644 --- a/src/scripts/ci/appveyor.yml +++ b/src/scripts/ci/appveyor.yml @@ -10,10 +10,14 @@ environment: MODE: --enable-shared - COMPILER: msvc-12.0 MODE: --disable-shared + - COMPILER: msvc-12.0 + MODE: --via-amalgamation - COMPILER: msvc-14.0 MODE: --enable-shared - COMPILER: msvc-14.0 MODE: --disable-shared + - COMPILER: msvc-14.0 + MODE: --via-amalgamation install: - if %compiler% == msvc-12.0 ( @@ -23,9 +27,12 @@ install: call "%ProgramFiles(x86)%\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" %PLATFORM% ) - cl # check compiler version + + - appveyor DownloadFile http://download.qt.io/official_releases/jom/jom.zip -FileName jom.zip + - 7z e jom.zip build_script: - - python configure.py --cc=msvc --cpu=%PLATFORM% %MODE% - - nmake + - python configure.py --cc=msvc --cpu=%PLATFORM% %MODE% --with-pkcs11 + - jom -j2 - botan-test - nmake install diff --git a/src/scripts/ci/circle/clang-shared-debug.sh b/src/scripts/ci/circle/clang-shared-debug.sh index 5f38cad7c..c3f6cb9fc 100755 --- a/src/scripts/ci/circle/clang-shared-debug.sh +++ b/src/scripts/ci/circle/clang-shared-debug.sh @@ -5,6 +5,6 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai BUILD_NICKNAME=$(basename "$0" .sh) BUILD_DIR="./build-$BUILD_NICKNAME" -./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --cc=clang +./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --cc=clang --with-pkcs11 make -j 2 -f "$BUILD_DIR"/Makefile "$BUILD_DIR"/botan-test diff --git a/src/scripts/ci/circle/clang-static-debug.sh b/src/scripts/ci/circle/clang-static-debug.sh index 56f111190..9e5be526e 100755 --- a/src/scripts/ci/circle/clang-static-debug.sh +++ b/src/scripts/ci/circle/clang-static-debug.sh @@ -5,6 +5,6 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai BUILD_NICKNAME=$(basename "$0" .sh) BUILD_DIR="./build-$BUILD_NICKNAME" -./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --cc=clang --disable-shared +./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --cc=clang --disable-shared --with-pkcs11 make -j 2 -f "$BUILD_DIR"/Makefile "$BUILD_DIR"/botan-test diff --git a/src/scripts/ci/circle/gcc-sanitizer.sh b/src/scripts/ci/circle/gcc-sanitizer.sh index 33d474fc6..e743d66af 100755 --- a/src/scripts/ci/circle/gcc-sanitizer.sh +++ b/src/scripts/ci/circle/gcc-sanitizer.sh @@ -5,7 +5,6 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai BUILD_NICKNAME=$(basename "$0" .sh) BUILD_DIR="./build-$BUILD_NICKNAME" -# Adding Ubsan here, only added in GCC 4.9 -./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --with-sanitizer --cc-abi-flags='-fsanitize=undefined' +./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --with-sanitizer --with-pkcs11 make -j 2 -f "$BUILD_DIR"/Makefile "$BUILD_DIR"/botan-test diff --git a/src/scripts/ci/circle/gcc-shared-debug.sh b/src/scripts/ci/circle/gcc-shared-debug.sh index 4f5ed1b6d..b65ce805f 100755 --- a/src/scripts/ci/circle/gcc-shared-debug.sh +++ b/src/scripts/ci/circle/gcc-shared-debug.sh @@ -5,6 +5,6 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai BUILD_NICKNAME=$(basename "$0" .sh) BUILD_DIR="./build-$BUILD_NICKNAME" -./configure.py --with-build-dir="$BUILD_DIR" --with-debug +./configure.py --with-build-dir="$BUILD_DIR" --with-debug --with-pkcs11 make -j 2 -f "$BUILD_DIR"/Makefile "$BUILD_DIR"/botan-test diff --git a/src/scripts/ci/circle/gcc-static-debug.sh b/src/scripts/ci/circle/gcc-static-debug.sh index 76f4c46b7..3a8900fb4 100755 --- a/src/scripts/ci/circle/gcc-static-debug.sh +++ b/src/scripts/ci/circle/gcc-static-debug.sh @@ -5,6 +5,6 @@ which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if avai BUILD_NICKNAME=$(basename "$0" .sh) BUILD_DIR="./build-$BUILD_NICKNAME" -./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --disable-shared --via-amalgamation +./configure.py --with-build-dir="$BUILD_DIR" --with-debug-info --disable-shared --via-amalgamation --with-pkcs11 make -j 2 -f "$BUILD_DIR"/Makefile "$BUILD_DIR"/botan-test diff --git a/src/scripts/ci/travis/build.sh b/src/scripts/ci/travis/build.sh index 50fc3164f..f2b4f2b67 100755 --- a/src/scripts/ci/travis/build.sh +++ b/src/scripts/ci/travis/build.sh @@ -2,73 +2,171 @@ set -ev which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if available -if [ "$BUILD_MODE" = "static" ]; then - CFG_FLAGS=(--disable-shared --via-amalgamation) -elif [ "$BUILD_MODE" = "shared" ]; then - CFG_FLAGS=() +MAKE_PREFIX="" +TEST_PREFIX="" +TEST_EXE=./botan-test +CFG_FLAGS=(--prefix=/tmp/botan-installation --cc=$CC --os=$TRAVIS_OS_NAME) + +CFG_FLAGS+=(--with-pkcs11) + +CC_BIN=$CXX + +if [ "$BUILD_MODE" = "static" ] || [ "$BUILD_MODE" = "mini-static" ]; then + CFG_FLAGS+=(--disable-shared --via-amalgamation) +elif [ "$BUILD_MODE" = "shared" ] || [ "$BUILD_MODE" = "mini-shared" ]; then + # No special flags required for shared lib build + CFG_FLAGS+=() +elif [ "$BUILD_MODE" = "sonarqube" ]; then + # No special flags required + CFG_FLAGS+=() +elif [ "$BUILD_MODE" = "parallel" ]; then + + if [ "$CC" = "gcc" ]; then + CFG_FLAGS+=(--with-cilkplus) + else + CFG_FLAGS+=(--with-openmp) + fi + elif [ "$BUILD_MODE" = "coverage" ]; then - CFG_FLAGS=(--with-coverage) + CFG_FLAGS+=(--with-coverage) elif [ "$BUILD_MODE" = "sanitizer" ]; then - CFG_FLAGS=(--with-sanitizers) + export ASAN_OPTIONS=detect_leaks=0 + CFG_FLAGS+=(--with-sanitizers) +elif [ "$BUILD_MODE" = "valgrind" ]; then + CFG_FLAGS+=(--with-valgrind --with-debug-info) + TEST_PREFIX="valgrind --track-origins=yes --error-exitcode=9 -v" fi -if [ "$MODULES" = "min" ]; then - CFG_FLAGS+=(--minimized-build --enable-modules=base) +if [ "$BUILD_MODE" = "mini-static" ] || [ "$BUILD_MODE" = "mini-shared" ]; then + CFG_FLAGS+=(--minimized-build --enable-modules="base,dev_random,system_rng,sha2_32,sha2_64,aes") +elif [ "$BUILD_MODE" = "valgrind" ]; then + # Valgrind on Travis on full build takes too long and the job is killed + # Prune to the most important stuff + CFG_FLAGS+=(--module-policy=modern --enable-modules=tls) + +elif [ "${BUILD_MODE:0:5}" != "cross" ]; then + # Only use external libraries when compiling natively + CFG_FLAGS+=(--with-bzip2 --with-lzma --with-sqlite --with-zlib) + + # Avoid OpenSSL when using dynamic checkers... + if [ "$BUILD_MODE" != "sanitizer" ] && [ "$BUILD_MODE" != "valgrind" ]; then + CFG_LFAGS+=(--with-openssl) + fi fi -if [ "$BOOST" = "y" ]; then +if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "${BUILD_MODE:0:5}" != "cross" ]; then + # The Boost-specific codepaths are tested via the OS X CI CFG_FLAGS+=(--with-boost) fi -# Workaround for missing update-alternatives -# https://github.com/travis-ci/travis-ci/issues/3668 -if [ "$CXX" = "g++" ]; then - export CXX="/usr/bin/g++-4.8" +if [ "${BUILD_MODE:0:6}" = "cross-" ]; then + CFG_FLAGS+=(--disable-shared) + + if [ "$TRAVIS_OS_NAME" = "osx" ]; then + MAKE_PREFIX="xcrun --sdk iphoneos" + if [ "$BUILD_MODE" = "cross-arm32" ]; then + CFG_FLAGS+=(--cpu=armv7 --cc-abi-flags="-arch armv7 -arch armv7s -stdlib=libc++") + elif [ "$BUILD_MODE" = "cross-arm64" ]; then + CFG_FLAGS+=(--cpu=armv8-a --cc-abi-flags="-arch arm64 -stdlib=libc++") + fi + elif [ "$TRAVIS_OS_NAME" = "linux" ]; then + CFG_FLAGS+=(--cc-abi-flags="-static-libstdc++") + + if [ "$BUILD_MODE" = "cross-arm32" ]; then + CC_BIN=arm-linux-gnueabihf-g++-4.8 + TEST_PREFIX="qemu-arm -L /usr/arm-linux-gnueabihf/" + CFG_FLAGS+=(--cpu=armv7) + CFG_FLAGS+=(--module-policy=modern --enable-modules=tls) + elif [ "$BUILD_MODE" = "cross-arm64" ]; then + CC_BIN=aarch64-linux-gnu-g++-4.8 + TEST_PREFIX="qemu-aarch64 -L /usr/aarch64-linux-gnu/" + CFG_FLAGS+=(--cpu=armv8-a) + CFG_FLAGS+=(--module-policy=modern --enable-modules=tls) + elif [ "$BUILD_MODE" = "cross-ppc32" ]; then + CC_BIN=powerpc-linux-gnu-g++-4.8 + TEST_PREFIX="qemu-ppc -L /usr/powerpc-linux-gnu/" + CFG_FLAGS+=(--cpu=ppc32) + CFG_FLAGS+=(--module-policy=modern --enable-modules=tls) + elif [ "$BUILD_MODE" = "cross-ppc64" ]; then + CC_BIN=powerpc64le-linux-gnu-g++-4.8 + TEST_PREFIX="qemu-ppc64 -L /usr/powerpc64le-linux-gnu/" + CFG_FLAGS+=(--cpu=ppc64) + CFG_FLAGS+=(--module-policy=modern --enable-modules=tls) + elif [ "$BUILD_MODE" = "cross-win32" ]; then + CC_BIN=i686-w64-mingw32-g++ + # No test prefix needed, PE executes as usual with Wine installed + CFG_FLAGS+=(--cpu=x86_32 --os=mingw --cc-abi-flags="-static") + TEST_EXE=./botan-test.exe + fi + fi fi -# enable ccache -if [ "$TRAVIS_OS_NAME" = "linux" ]; then - ccache --max-size=30M - ccache --show-stats +CFG_FLAGS+=(--cc-bin="ccache $CC_BIN") - export CXX="ccache $CXX" +if [ "$BUILD_MODE" = "sonarqube" ]; then + MAKE_PREFIX="./build-wrapper-linux-x86/build-wrapper-linux-x86-64 --out-dir bw-outputs" fi # configure -if [ "$TARGETOS" = "ios32" ]; then - ./configure.py "${CFG_FLAGS[@]}" --cpu=armv7 --cc=clang \ - --cc-abi-flags="-arch armv7 -arch armv7s -stdlib=libc++" \ - --prefix=/tmp/botan-installation +./configure.py "${CFG_FLAGS[@]}" -elif [ "$TARGETOS" = "ios64" ]; then - ./configure.py "${CFG_FLAGS[@]}" --cpu=armv8-a --cc=clang \ - --cc-abi-flags="-arch arm64 -stdlib=libc++" \ - --prefix=/tmp/botan-installation +# pre-build ccache stats +ccache --show-stats -else - $CXX --version - ./configure.py "${CFG_FLAGS[@]}" --cc="$CC" --cc-bin="$CXX" \ - --with-bzip2 --with-lzma --with-openssl --with-sqlite --with-zlib \ - --prefix=/tmp/botan-installation -fi +# build! +echo $MAKE_PREFIX make -j $BUILD_JOBS +time $MAKE_PREFIX make -j $BUILD_JOBS -# build -if [ "${TARGETOS:0:3}" = "ios" ]; then - xcrun --sdk iphoneos make -j 2 -else - make -j 2 -fi +# post-build ccache stats +ccache --show-stats + +# Run SonarQube analysis -if [ "$MODULES" != "min" ] && [ "${TARGETOS:0:3}" != "ios" ]; then - ./botan-test +if [ "$BUILD_MODE" = "sonarqube" ]; then + + if [ "$TRAVIS_BRANCH" = "master" ] && [ "$TRAVIS_PULL_REQUEST" = "false" ]; then + # => This will run a full analysis of the project and push results to the SonarQube server. + # + # Analysis is done only on master so that build of branches don't push analyses to the same project and therefore "pollute" the results + echo "Starting analysis by SonarQube..." + sonar-scanner "-Dsonar.login=$SONAR_TOKEN" + + # PR analysis deactivated at least until custom quality profiles can be created + elif false && [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ -n "${GITHUB_TOKEN-}" ]; then + # => This will analyse the PR and display found issues as comments in the PR, but it won't push results to the SonarQube server + # + # For security reasons environment variables are not available on the pull requests + # coming from outside repositories + # http://docs.travis-ci.com/user/pull-requests/#Security-Restrictions-when-testing-Pull-Requests + # That's why the analysis does not need to be executed if the variable GITHUB_TOKEN is not defined. + echo "Starting Pull Request analysis by SonarQube..." + sonar-scanner -Dsonar.login=$SONAR_TOKEN \ + -Dsonar.analysis.mode=preview \ + -Dsonar.github.oauth=$GITHUB_TOKEN \ + -Dsonar.github.repository=$TRAVIS_REPO_SLUG \ + -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST + fi + # When neither on master branch nor on a non-external pull request => nothing to do + fi + +if [ "$BUILD_MODE" == "sonarqube" ] || \ + ( [ "${BUILD_MODE:0:5}" == "cross" ] && [ "$TRAVIS_OS_NAME" == "osx" ] ); then + echo "Running tests disabled on this build type" +else + echo Running $TEST_PREFIX $TEST_EXE + time $TEST_PREFIX $TEST_EXE fi -if [ "$MODULES" != "min" ] && [ "$BUILD_MODE" = "shared" ] && [ "$TARGETOS" = "native" ] +# Run Python tests (need shared libs) +if [ "$BUILD_MODE" = "shared" ] then - python2 --version - python3 --version - LD_LIBRARY_PATH=. python2 src/python/botan.py - LD_LIBRARY_PATH=. python3 src/python/botan.py + # TODO: find all things in PATH that begin with python- and execute them :) + for py in python2 python3 + do + $py --version + LD_LIBRARY_PATH=. $py src/python/botan.py + done fi +# Test make install make install diff --git a/src/scripts/ci/travis/install.sh b/src/scripts/ci/travis/install.sh index 0e49ad363..987438127 100755 --- a/src/scripts/ci/travis/install.sh +++ b/src/scripts/ci/travis/install.sh @@ -1,26 +1,61 @@ -#!/bin/sh +#!/bin/bash set -ev which shellcheck > /dev/null && shellcheck "$0" # Run shellcheck on this if available if [ "$BUILD_MODE" = "coverage" ]; then - wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.11.orig.tar.gz - tar -xvf lcov_1.11.orig.tar.gz + wget http://ftp.de.debian.org/debian/pool/main/l/lcov/lcov_1.12.orig.tar.gz + tar -xvf lcov_1.12.orig.tar.gz export PREFIX="/tmp" - make -C lcov-1.11/ install + make -C lcov-1.12/ install pip install --user coverage pip install --user codecov fi -if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$TARGETOS" != "ios" ]; then +if [ "$BUILD_MODE" = "sonarqube" ]; then + curl -LsS https://sonarqube.com/static/cpp/build-wrapper-linux-x86.zip > build-wrapper-linux-x86.zip + unzip build-wrapper-linux-x86.zip +fi + +if [ "$TRAVIS_OS_NAME" = "linux" ]; then + if [ "$BUILD_MODE" = "valgrind" ] || [ "${BUILD_MODE:0:5}" = "cross" ]; then + sudo apt-get -qq update + + if [ "$BUILD_MODE" = "valgrind" ]; then + sudo apt-get install valgrind + elif [ "$BUILD_MODE" = "cross-arm32" ]; then + sudo apt-get install g++-4.8-arm-linux-gnueabihf libc6-dev-armhf-cross qemu-user + elif [ "$BUILD_MODE" = "cross-arm64" ]; then + sudo apt-get install g++-4.8-aarch64-linux-gnu libc6-dev-arm64-cross qemu-user + elif [ "$BUILD_MODE" = "cross-ppc32" ]; then + sudo apt-get install g++-4.8-powerpc-linux-gnu libc6-dev-powerpc-cross qemu-user + elif [ "$BUILD_MODE" = "cross-ppc64" ]; then + sudo apt-get install g++-4.8-powerpc64le-linux-gnu libc6-dev-ppc64el-cross qemu-user + elif [ "$BUILD_MODE" = "cross-win32" ]; then + sudo apt-get install g++-mingw-w64-i686 mingw-w64-i686-dev + + # See https://github.com/travis-ci/travis-ci/issues/6460 + sudo dpkg --add-architecture i386 + sudo apt-get -qq update # have to update again due to adding i386 above + sudo apt-get install wine + fi + fi +fi + +if [ "$TRAVIS_OS_NAME" = "osx" ]; then # Workaround for https://github.com/Homebrew/homebrew/issues/42553 brew update || brew update - brew install xz - brew install python # python2 - brew install python3 + brew install ccache + + if [ "$BUILD_MODE" != "cross-arm32" ] && [ "$BUILD_MODE" != "cross-arm64" ]; then + brew install xz + brew install python # python2 + brew install python3 + + # Boost 1.58 is installed on Travis OS X images + # brew install boost + fi - # Boost 1.58 is installed on Travis OS X images - # brew install boost fi diff --git a/src/scripts/install.py b/src/scripts/install.py index 1d4d27b76..799d8ea4e 100755 --- a/src/scripts/install.py +++ b/src/scripts/install.py @@ -134,7 +134,7 @@ def main(args = None): 'botan') out_dir = process_template('%{out_dir}') - app_exe = process_template('botan%{program_suffix}') + app_exe = process_template('botan%{program_suffix}') if str(cfg['os']) != "windows" else 'botan-cli.exe' for d in [options.destdir, lib_dir, bin_dir, target_doc_dir, target_include_dir]: makedirs(d) @@ -147,13 +147,20 @@ def main(args = None): copy_file(os.path.join(build_include_dir, include), 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), + os.path.join(target_include_dir, include)) + static_lib = process_template('%{lib_prefix}%{libname}.%{static_suffix}') copy_file(os.path.join(out_dir, static_lib), os.path.join(lib_dir, os.path.basename(static_lib))) if bool(cfg['build_shared_lib']): if str(cfg['os']) == "windows": - soname_base = process_template('%{soname_base}') # botan.dll + libname = process_template('%{libname}') + soname_base = libname + '.dll' copy_executable(os.path.join(out_dir, soname_base), os.path.join(lib_dir, soname_base)) else: diff --git a/src/scripts/tls_suite_info.py b/src/scripts/tls_suite_info.py index 6424341d2..1d059b3f9 100755 --- a/src/scripts/tls_suite_info.py +++ b/src/scripts/tls_suite_info.py @@ -117,8 +117,9 @@ def to_ciphersuite_info(code, name): iv_len = 12 if code in ['CC13', 'CC14', 'CC15']: iv_len = 0 # Google variant - return 'Ciphersuite(0x%s, "%s", "%s", "%s", %d, %d, %d, "AEAD", %d, "%s")' % ( - code, sig_algo, kex_algo, "ChaCha20Poly1305", cipher_keylen, iv_len, 0, 0, mac_algo) + 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']: @@ -133,19 +134,16 @@ def to_ciphersuite_info(code, name): cipher_algo += '/' + mode if mode == 'CBC': - return 'Ciphersuite(0x%s, "%s", "%s", "%s", %d, %d, 0, "%s", %d)' % ( - code, sig_algo, kex_algo, cipher_algo, cipher_keylen, ivlen, mac_algo, mac_keylen[mac_algo]) + return (name, code, sig_algo, kex_algo, cipher_algo, cipher_keylen, ivlen, 0, mac_algo, mac_keylen[mac_algo], "") elif mode == 'OCB': - return 'Ciphersuite(0x%s, "%s", "%s", "%s", %d, %d, %d, "AEAD", %d, "%s")' % ( - code, sig_algo, kex_algo, cipher_algo, cipher_keylen, 12, 0, 0, mac_algo) + 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 'Ciphersuite(0x%s, "%s", "%s", "%s", %d, %d, %d, "AEAD", %d, "%s")' % ( - code, sig_algo, kex_algo, cipher_algo, cipher_keylen, iv_bytes_from_hs, iv_bytes_from_rec, 0, mac_algo) + 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' @@ -219,7 +217,7 @@ def main(args = None): should_use = False if should_use: - suites[code] = (name, to_ciphersuite_info(code, name)) + suites[code] = to_ciphersuite_info(code, name) sha1 = hashlib.sha1() sha1.update(contents) @@ -231,7 +229,7 @@ def main(args = None): out.close() def define_custom_ciphersuite(name, code): - suites[code] = (name, to_ciphersuite_info(code, name)) + suites[code] = to_ciphersuite_info(code, name) # Google servers - draft-agl-tls-chacha20poly1305-04 define_custom_ciphersuite('ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256', 'CC13') @@ -295,32 +293,25 @@ namespace Botan { namespace TLS { -std::vector<u16bit> Ciphersuite::all_known_ciphersuite_ids() +//static +const std::vector<Ciphersuite>& Ciphersuite::all_known_ciphersuites() { - return std::vector<u16bit>{ + // Note that this list of ciphersuites is ordered by id! + static const std::vector<Ciphersuite> g_ciphersuite_list = { """ - for i in sorted(suites.keys()): - suite_info += " 0x%s,\n" % (i) - - suite_info += """ }; -} - -Ciphersuite Ciphersuite::by_id(u16bit suite) - { - switch(suite) - { -""" + 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]) - for i in sorted(suites.keys()): - suite_name = suites[i][0] - suite_expr = suites[i][1] - suite_info += " case 0x%s: // %s\n" % (i, suite_name) - suite_info += " return %s;\n\n" % (suite_expr) + suite_info += " " + suite_expr + ",\n" + - suite_info += """ } + suite_info += """ }; - return Ciphersuite(); // some unknown ciphersuite + return g_ciphersuite_list; } } diff --git a/src/tests/data/aead/gcm.vec b/src/tests/data/aead/gcm.vec index 21bc3a53e..516e828ec 100644 --- a/src/tests/data/aead/gcm.vec +++ b/src/tests/data/aead/gcm.vec @@ -38,6 +38,29 @@ In = D9313225F88406E5A55909C5AFF5269A86A7A9531534F7DA2E4C303D8A318A721C3C0C9 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-192/GCM] # Nist | Test Case 7 Key = 000000000000000000000000000000000000000000000000 diff --git a/src/tests/data/block/serpent.vec b/src/tests/data/block/serpent.vec index 75511f62d..623ee6be8 100644 --- a/src/tests/data/block/serpent.vec +++ b/src/tests/data/block/serpent.vec @@ -3,6 +3,10 @@ Key = 00000000000000000000000000000000 In = D29D576FCEA3A3A7ED9099F29273D78E2D62A890CEA3A3A7ED9099F29273D78ED29D576F315C5C58ED9099F29273D78E2D62A890315C5C58ED9099F29273D78ED29D576FCEA3A3A7126F660D9273D78E2D62A890CEA3A3A7126F660D9273D78ED29D576F315C5C58126F660D9273D78E2D62A890315C5C58126F660D9273D78ED29D576FCEA3A3A7ED9099F26D8C28712D62A890CEA3A3A7ED9099F26D8C2871D29D576F315C5C58ED9099F26D8C28712D62A890315C5C58ED9099F26D8C2871D29D576FCEA3A3A7126F660D6D8C28712D62A890CEA3A3A7126F660D6D8C2871D29D576F315C5C58126F660D6D8C2871 Out = B2288B968AE8B08648D1CE9606FD992D717EB02EB81A2E939D54ACA91087112D0D809C5EE82F477EBA7B956DBB23463B0F0190D616F5294112FFB7884E8B37F941BA1B505386B7428B88338188F7E718A3348230BF5CFA552F88D22463D9703A115351622E016BCA26918D17E13225F67EE4E3F2C46FE52ECBDA044C585717DC563A8403FF5309D62370B1DCF5A11EDD2F7D73602B70CD2553E44C1D3F170126155BBD9BE3A965B345E834718F651CEF6CC65E8C5C566E894817350F497816F1EEFA51FC91FEBB6E9F8CB141CC0EB6AF3C6F8380CBD3C996167F2F0E90E71B756C87EB62A4975356B28DCBF6A64A0BD1 +Key = 0000000000000000000000000000000000000000000000000000000000000000 +In = D095576FCEA3E3A7ED98D9F29073D78E2F6AA890CEA3E3A7ED98D9F29073D78ED095576F315C1C58ED98D9F29073D78E2F6AA890315C1C58ED98D9F29073D78ED095576FCEA3E3A71267260D9073D78E2F6AA890CEA3E3A71267260D9073D78ED095576F315C1C581267260D9073D78E2F6AA890315C1C581267260D9073D78E5718F3B4ED59D02DE5C40E9A826FFF30AC56479B43617B1C7C804629E36E93F520027AB27AB4CCF48F9973CC052E0A35C8DD678E5D5E8F67FAA0CB599C7886BD +Out = B90EE5862DE69168F2BDD5125B45472BA3E17E2DF4EA6F41B2017E37023F202AFD2951E466110BC6F4816EBF968CDD01C36EE750C51192B0C85D5BB2584AE06286069E27F65F454C6E3F7E9097DCEFAA00FA885A8854844C970338841CA2E24DA18A399A0AA2FD20EAA740A0CB6145B53D79E39A79CC14D97147F3D172F66BB19263BE9CA3CB9661695C1CCD1041F2E8C35E27B56BAA1AF03542B3DA703BFEF722AAA7F89676ADAA2923903B2A3DB526734448F52EDB9316CAFA7F095C24B0E7 + Key = 000000000000000000000000000000000000000000000000 In = D29D576FCEABA3A7ED9899F2927BD78E Out = 130E353E1037C22405E8FAEFB2C3C3E9 diff --git a/src/tests/data/block/xtea.vec b/src/tests/data/block/xtea.vec index 94b25ded2..e2377c887 100644 --- a/src/tests/data/block/xtea.vec +++ b/src/tests/data/block/xtea.vec @@ -7,6 +7,10 @@ Key = 00112233445566778899AABBCCDDEEFF In = 0123456789ABCDEF Out = B8BF2821622B5B30 +Key = 00112233445566778899AABBCCDDEEFF +In = FEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEFFEFEFEFEFEFEFEFE0123456789ABCDEF +Out = 36552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B3036552E889D6A41CFB8BF2821622B5B30 + Key = D94576CD1A5F99E4155DC7BEC5D33DF2 In = D51399607F7AA9D7 Out = 782E4E131C5BA746 diff --git a/src/tests/data/charset.vec b/src/tests/data/charset.vec new file mode 100644 index 000000000..dd64ac6e3 --- /dev/null +++ b/src/tests/data/charset.vec @@ -0,0 +1,41 @@ +[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
\ No newline at end of file diff --git a/src/tests/data/hash/parallel.vec b/src/tests/data/hash/parallel.vec index 8fd62a76b..544ecc0b8 100644 --- a/src/tests/data/hash/parallel.vec +++ b/src/tests/data/hash/parallel.vec @@ -9,3 +9,7 @@ Out = 0CC175B9C0F1B6A831C399E26977266186F7E437FAA5A7FCE15D1DDCB9EAEAEA377667B8 In = Out = DA39A3EE5E6B4B0D3255BFEF95601890AFD80709CDF26213A150DC3ECB610F18F6B38B463293AC630C13F0245F92BBB1766E16167A4E58492DDE73F3 +[Parallel(SHA-256,SHA-512)] +In = +Out = E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9CE47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E + diff --git a/src/tests/data/hmac_drbg.vec b/src/tests/data/hmac_drbg.vec index d244cd4ca..6b018b0a2 100644 --- a/src/tests/data/hmac_drbg.vec +++ b/src/tests/data/hmac_drbg.vec @@ -1,4 +1,10 @@ -[HMAC_DRBG(SHA-1)] + +# 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 @@ -59,6 +65,96 @@ 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 @@ -119,6 +215,96 @@ EntropyInput = 9C88099AF48F9053ABEC455B7BBB015364FD593A0F40175D79E501B77F967A676 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 @@ -179,6 +365,96 @@ 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 @@ -239,6 +515,96 @@ EntropyInput = BA5AECC5DB239D14AB4B395D7FC79DFD1ED217DF37D79A551DD11C419A0B07D05 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 @@ -299,6 +665,96 @@ 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 @@ -359,6 +815,96 @@ EntropyInput = 82DF9BAF15BBD613CED8A7E4C54F349FB4946811FECBCB505844DEC944E403F50 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 @@ -419,6 +965,96 @@ 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 @@ -479,7 +1115,98 @@ EntropyInput = 366338CBAB989F18525B91D2C75E6D918AA9E6516F739B4662FC1A2145D7C72DE EntropyInputReseed = 7B4CC3D5FA5547B4FD198F0BAFC1984B Out = 3503E5F10923E6D34D2C14FB07148D61A2AB52EEDF5AA8610F5F13890D72CD8F475A6138D316027F1616BF1EBB4730A3C3F91DDA46569CE7ABE7297AB00F20F1201B24F2F683E0140083F3D38D81B5BD -[HMAC_DRBG(SHA-224)] +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 @@ -540,6 +1267,96 @@ EntropyInput = 525615164DCE0DAC5397B357546AAD049DBE5982DA2C215A233557553460F8505 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 @@ -600,6 +1417,96 @@ EntropyInput = 5C7C9690A1926A4580C691C2E5327E736D5C3AEC0CE8F5D32D4946BC4B607F712 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 @@ -660,6 +1567,96 @@ EntropyInput = 794B1400E41573827FA7860C7B9E2DC78985178A17D616B027E1F6A2ACC1A6379 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 @@ -720,6 +1717,96 @@ EntropyInput = 04C5C1C3DDAB060731E30B59011CCA48500E4B94C85059FDD1956619B57595B97 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 @@ -780,6 +1867,96 @@ EntropyInput = 836284634963E77FDDFE15F082675A253D21535E04927C0D0F66CEAD08AB69E97 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 @@ -840,6 +2017,96 @@ EntropyInput = 3ECD3608CBA641494D31F0B3BD690D06179A34BE0B11E8722D8B61B31B1491F01 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 @@ -900,6 +2167,96 @@ EntropyInput = B9024D3018564B27CFBA304E3698871A3ED11D768BF1FDE973BF310B51374082B 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 @@ -960,7 +2317,98 @@ EntropyInput = 7905311E1C3E62880033C9909CECFF0C81A1F351C81BB71D80E329C843C25C980 EntropyInputReseed = 114C588FF60F48FE0FB2FB320C7A54D512132A2F530ABB3C Out = 8A018866798E04F7A5C8A35E829D547629BA8E6189E88AB9184C01CF61A9C12F12F17AA48CCF1690BF6646DDDC92D79D1704BA517DAE097CAD527B56E762373083C7D0A37CF16B7B58A4C97441FF4B4EF54AE3E8773B4F20BC681E0AE2FBD3FD3C08D925E7E5B6379A172882B2E706C0 -[HMAC_DRBG(SHA-256)] +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 @@ -1021,6 +2469,96 @@ EntropyInput = 714277D408AD87FDE317F0A94732FCE62F1352BDC90936673B4F1DAA0925AA26D 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 @@ -1081,6 +2619,96 @@ EntropyInput = 254FF5687A6DAD3F1D237DC762F58D24EF2E2C084D0A48D26A3DC81E5490CDA3F 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 @@ -1141,6 +2769,96 @@ EntropyInput = 103E04DC6C885DE4225067C8DD67CEC5A3DD7C45586D2ADF59B54B546CDC15915 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 @@ -1201,6 +2919,96 @@ EntropyInput = 9829D2E5409629D9C53C7DBB16C619B616B0D17394A3E055BF6FAE9FCBBBAFD4E 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 @@ -1261,6 +3069,96 @@ EntropyInput = C558926A4DBB9F41E75689D9C8AEC86797C29F8C77E356F0331BED788B76E9B7C 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 @@ -1321,6 +3219,96 @@ EntropyInput = DC5904BD752C66E025072622824E4E789DFAFEDCBAAD3356A344953E002FF8451 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 @@ -1381,6 +3369,96 @@ EntropyInput = 001CF2BB87EE4AA145011908CE79920700FF40CE765099292B7B7AEC68EEB05EB 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 @@ -1441,7 +3519,98 @@ EntropyInput = 9284FD4660BEB7A154349D74E2AD8442A5AC0667AC4D28DAF0529DAC5C805A21A EntropyInputReseed = F4942B20A42589A22E1B3B2214336D1BA3B11753937B93F1D7C3636B346D70A1 Out = F0B87F8C3C67F4DF3CC613C3C67999675951177C2D7D646EC03E522267EA1D39D42060D8B157774AF7AD7FD7F851F9C13AAFA56A64D7C0FF86C8DD9588F69C6E7A9680759BC1B602798B23959FE54FF4BD2CE2D8EDE7298F68801AAD61977485E0ACBADEECF47B7EB30E92F406D973E326518DB3AF0EA06EA574BA7B0161ABF2 -[HMAC_DRBG(SHA-384)] +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 @@ -1502,6 +3671,96 @@ EntropyInput = 31836D292CB46AAD594171E76237A3422844F62FB14D0CDF63BA587E73501051C 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 @@ -1562,6 +3821,96 @@ EntropyInput = F5BA27C487A40DFE342FE18E7F9C72BEBC1EA229C7634CCE87DEFD7AA11448E3F 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 @@ -1622,6 +3971,96 @@ EntropyInput = 878893D8396EC7296E54542E0CF128AE54586F881C0006018DC091305B53F28E1 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 @@ -1682,6 +4121,96 @@ EntropyInput = FE81E81D004293758EF6C3C90A3CB3A6BB16E11342E1EEFB6F2E7E1AA07353780 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 @@ -1742,6 +4271,96 @@ EntropyInput = 594986D76381473AA0470F1E89A70CF84F5DCC4A465D98877C58ACC47A12270D5 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 @@ -1802,6 +4421,96 @@ EntropyInput = BC98062C88EEBACA74E3FAFF5389E92F14D7CE6AD5A72A7E31EA1094349CE6AF8 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 @@ -1862,6 +4571,96 @@ EntropyInput = 0CB47A66B5873A2CDCD19B528DBEC03818386F3475C998347FE5F7DAB55672D10 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 @@ -1922,7 +4721,98 @@ EntropyInput = 7B9CC17409A64DE98171684205DF0177A8B75BC81103004288EBCF1B8CD646B2B EntropyInputReseed = 97F5006FF023F3FBB48452DCB8E3F4EFD8580303730407411F3A53D44D4B13CB Out = 8C457791B5E79A32C1A5BDB023A51FE82DE8217D12CC45A91AC15C11BC81BBD7F545A587422191C361F10E44FAFDF576D33A580F34682B9BA132CF5154F0FA3BB221CEE52B3C7227823858B487867D326D1D139C0DBD88BE8720346AA6AD9DDD8D7C55844B4FCB75C7B79F1091320B8DF9CEFD837A45CE9071013E74D67615FAC3E64189152296F0BB695A2C0DE27DF23A1CB2728F35259404A656E7B238812045301520584AD9E3A39D19F16A0ED6C64B5544E9AA4750A2F44445C4AC9E9A3C -[HMAC_DRBG(SHA-512)] +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 @@ -1983,6 +4873,96 @@ EntropyInput = E1D2D72E7907E7214CB266F1EF641395E54B39E8365304661B0BEE371F3246528 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 @@ -2043,6 +5023,96 @@ EntropyInput = 47C42DF62B4DD570EFD3C2722AD39A2DF5F969A13F645FD27B5290877BA70916C 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 @@ -2103,6 +5173,96 @@ EntropyInput = B67D59466823441123CE4A471D10C546EF96E96EB8137530F89E189FA32E0A50F 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 @@ -2163,6 +5323,96 @@ EntropyInput = 8AC96C74454A89AA1B7D74CCFCA4DEFB8614E0F065B8718F3FB943A62A16C2D7C 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 @@ -2223,6 +5473,96 @@ EntropyInput = C7C9CCE7B1240B8C6144E9B7CC31AD066C7E5BC3742DCE1540CE56A078CE5FD8A 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 @@ -2283,6 +5623,96 @@ EntropyInput = 2267F893091CB3F47D624040618B586245456FE8B224DCB892B21BE185C4E7E3C 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 @@ -2343,6 +5773,96 @@ EntropyInput = 598D34167065E39098233B817B169CD13781F0F68594BAD2E3F15EFBD259224FD 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 @@ -2403,3 +5923,2497 @@ EntropyInput = A2C4730D71871D2072DF3AC8F10ADB962D1D28AB1C9E809C7C61C4B3783AC19C0 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 + diff --git a/src/tests/data/kdf/kdf1_iso18033.vec b/src/tests/data/kdf/kdf1_iso18033.vec new file mode 100644 index 000000000..389ae9b0b --- /dev/null +++ b/src/tests/data/kdf/kdf1_iso18033.vec @@ -0,0 +1,24 @@ + +# Test vectors from ISO 18033-2 + +# C.5.1 + +[KDF1-18033(SHA-1)] +Secret = D6E168C5F256A2DCFF7EF12FACD390F393C7A88D +OutputLen = 107 +Output = C325EBBB41A82551D5D0AD4834870A05EF3918C8CAAE38873F07DCA43127A4DEE36A6CA5970F6C06926037DE7DF79C4915D83FF705821D2C46A1FA7BB81B73E27176FEB7FD3A45E40B843F1AAEBCCB1EF4FA7EE3B9B491A342F43EAAA435EFDED41E0A3A6EC2EFF1F2ED95 + +Secret = B711F58766B5D696513538F03036F30E0FC11CE1CAAE38873F07DCA43127A4DEE36A6CA5970F6C06926037DE7DF79C4915D83FF705821D2C46A1FA7BB81B73E27176FEB7FD3A45E40B843F1AAEBCCB1FD4AE168ACA94F8D062951EDEC1469BFEB97B79490FA58AD1D3CCB4 +OutputLen = 20 +Output = 281D7CB2D7D5531ED1F9382152D9BE9A89A1DF09 + +# C.5.3 + +[KDF1-18033(SHA-256)] +Secret = D6E168C5F256A2DCFF7EF12FACD390F393C7A88D +OutputLen = 20 +Output = 0742BA966813AF75536BB6149CC44FC256FD6406 + +Secret = 09248DA92DCF5CA8360AE7F18533A19C6BA8E99ADF79665BC31DC5A62F70535E52C53015B9D37D412FF3C1193439599E1B628774C50D9CCB78D82C425E4521EE47B8C36A4BCFFE8B8112A89312FC04432A6DB6F05118F9946C80230CD9222E0146F2CBD5251CC388A62359 +OutputLen = 20 +Output = 6F0195F38EED2417AA6EB7A365245073E58711DB
\ No newline at end of file diff --git a/src/tests/data/kdf/sp800_108_ctr.vec b/src/tests/data/kdf/sp800_108_ctr.vec index 5972fa39d..e264a842c 100644 --- a/src/tests/data/kdf/sp800_108_ctr.vec +++ b/src/tests/data/kdf/sp800_108_ctr.vec @@ -1,1820 +1,1456 @@ [SP800-108-Counter(SHA-1)] -Secret = 47EA5D00826F111BFA468E899B0CA3FDA7C8336D -Salt = DBED14156E1826AA1D4D66469C64A32571701131B27A8C595E8C0595665478FCF1B95C76AE997DE6184C919F4B810D588548508CD4C457A541260725 -OutputLen = 16 -Output = 7DE374B5EF7240FD425B7CF7C54C29F4 - -Secret = f7591733c856593565130975351954d0155abf3c -Salt = 8e347ef55d5f5e99eab6de706b51de7ce004f3882889e259ff4e5cff102167a5a4bd711578d4ce17dd9abe56e51c1f2df950e2fc812ec1b217ca08d6 -OutputLen = 16 -Output = 34fe44b0d8c41b93f5fa64fb96f00e5b - -Secret = 47ea5d00826f111bfa468e899b0ca3fda7c8336d -Salt = dbed14156e1826aa1d4d66469c64a32571701131b27a8c595e8c0595665478fcf1b95c76ae997de6184c919f4b810d588548508cd4c457a541260725 -OutputLen = 16 -Output = 7de374b5ef7240fd425b7cf7c54c29f4 - -Secret = 3b16654e2e89ff4acc57a6c5c8af8064807804a6 -Salt = 05e16ed1b560c4c9c43267f12ee454dafc0161bedce1a7d371ec17426d081efe54af8c2f2566d4eea38aabab91fb98fdbe16ccb6b114d677bcb00c66 -OutputLen = 16 -Output = 1d29a3d2499e9473dc62544d830ba773 - -Secret = 57e9fd6e0c54c90065593b44482342f2ea72c128 -Salt = bbbbefd47c997609c4522f64bc94a028a5c55c471181c74fef5a539ba3be77674b4eed9bb5ea0995b162027164e38dc63ceeb0ce6f5e7730ebe3471a -OutputLen = 16 -Output = 9691f99b94f20f9c548276de4eaf0665 +OutputLen = 2 +Salt = 876F7274958C9F920019 +Secret = 4C5FFEE342D0F1D9204CE138ED131558CF364BBC +Label = 6408DB93D00CE5FED51B9A00 +Output = 5B3A + +OutputLen = 2 +Salt = 1C465C8CA73184424257 +Secret = ABE28C646A02BBC70A61E011208FC8D7D2B7F955 +Label = 7D5AC51EB839DAE68A573FF1 +Output = D5C0 + +OutputLen = 2 +Salt = F7B66FAF7CE8D8C2AB4C +Secret = 2CFFB7FC425E39969B7E9D0A0276B8CE064E5A79 +Label = B1ACAFA14F1352DA2317A0B1 +Output = 2730 + +OutputLen = 4 +Salt = BE8D06763F91A55AA60A55B06CE7BD2C234D9C9B +Secret = C45A9C1136BC29A26E83E4EB5424A7F39C1AD786 +Label = 8E7C6A8F5FB03717F9C3C815 +Output = B122C542 + +OutputLen = 4 +Salt = 763720019CC71126C08468067013EC799EA551E5 +Secret = CDBC50F118B5D7DA2F508B0EE857E95690A613F6 +Label = B5019FCAAB99E3E36831FFBE +Output = 65184426 + +OutputLen = 4 +Salt = 515D252068D87A371FE5C899B1C2080CB28A11A2 +Secret = 0074CCAFD79E7DFD0280AE90A386BE8F920625E7 +Label = 0EA8F210978F8B6B19125F7A +Output = 5565C92B + +OutputLen = 6 +Salt = 6BEDA97746E6B0C7069E5C5CB2266A60B404094B35D17658712FDF0760AF +Secret = F2A86731F93686059970C42D35B7B2342BF55025 +Label = 0BBA8C310FA61D5F39035B4E +Output = E8BAF544389C + +OutputLen = 6 +Salt = 1065A01F835D9692D6B2B3A05817B8B14CE0D7FFB1EDA7C4BF2946E4E7D9 +Secret = 85D37474BFABB9712ABC130FEB8CC58A331C1470 +Label = 24E1CC4C884E0435D57E0E09 +Output = 8E0E7FC3AC91 + +OutputLen = 6 +Salt = A9548D0CF06D8D913B4A82180B30536E6DCA9E22058355B9BE479C5EAA53 +Secret = 59536A8219785131E8214324841F2A282F4618A9 +Label = 237A47DCE3899A707ABA4E0E +Output = 4EB42CF2706F + +OutputLen = 8 +Salt = 98602900A0774AD4804E7C0401CF78B17399DCE92D00032712CAF0118F77C02B758E9B77B1EC43E3 +Secret = 7D8AFEAC061F157C1692279D46142022CE35D9B7 +Label = 8548C364AA2F703B859B736B +Output = C4BC89B34AF77648 + +OutputLen = 8 +Salt = F3B7A2F4A05D513AD138C14926CF3621EE17FF98A1DF72F13E951322B5CEFB41AC818328926645DC +Secret = BD99552534CFCFFC19987B23551847B2F95CF634 +Label = 228F63EFD8029DB884E4CF33 +Output = D04DC1712A017F27 + +OutputLen = 8 +Salt = A73A6A3A0288A88BF9F115279BC8AADE2985E78C59ACACA43FA4F2E6BF8D75166914B9D4BDC88817 +Secret = 2F8E815356C734F27237E2841A42610B28C71FEB +Label = 20B5F315234AEFBBAF5CA7DE +Output = 03BA7A6F07130B2A + +OutputLen = 10 +Salt = 3FA1C9459DF2FEA454785CFA3227A09B3CD015E952C821882B67167091DFB2C14FF0FBC2DAF8662C7AD11889411CB6895075 +Secret = 51A0D8E24DA15DCC9A0DC0E3ADFC750DB3308E30 +Label = B9616977C379FAF054DBA414 +Output = 71A3C88CFF10BDB3B61A + +OutputLen = 10 +Salt = 0B761A25E33F26849E5A1054BCE664F6631B388018E1F547DDB4F01E4EA40A0F33A9C1C8F98D2CEBA43994586C6C5AA5E4F6 +Secret = C79763F027569C1EAB9F8B7C3064424B29EDE836 +Label = DD7962A43034915A95F2D85B +Output = A81A1C06AB1AED573C33 + +OutputLen = 10 +Salt = 1B8699E791E4C19A1C368D2ED685DBBC93B772879FB1333549B607131A22D5A7EF96840B193E7AC589D325DBE6293141932E +Secret = 0C88052600AE74BDC8FE47B592B968C4C374449B +Label = 7B0B0FAA28EF84835EADB3A1 +Output = 0D8B2F786BAF6506975B + +OutputLen = 12 +Salt = 574126FAE792D0701E37DAB8F613F22FC0611EA8195BBD2DF026454128370411A38A63FE06278981689C3E2F4ED94B96AB438AF5C21DACF0C519036B +Secret = 283AAF84E63D27A4BC786A6A24D24C301B009744 +Label = E5FAC14DB50AFB5E7952821B +Output = E703C7C66C97763FD998C653 + +OutputLen = 12 +Salt = 805179E584376CE99087F1AB5A0F327FCB5BF42A0B6CEDA2A8333AC4B1C0D4F0511E3286E0280958D31D6A10C5764C778248112F0661E4CCCDA7650F +Secret = 45A086923553F3C002DB1FA846534B9A994BB541 +Label = 5B514ABC62F8DDFE6CD6E4F9 +Output = 469E3627474B3F068C412CCB + +OutputLen = 12 +Salt = 965342192C969392522A49CC36B3979B3D3C66F84129C79F449E7CE10F37D410BC6AA94AB50FEA11A4ACA7009394D8315898ED944704135CA266AAB6 +Secret = 94D92F4ABCE00B2FBF47B9316892B9DA9382D520 +Label = 934E6FF267EFF269B33E8EF3 +Output = 0EFF573E75DD81871E44BDCD + +OutputLen = 14 +Salt = 4D4E84C32D30D351C4376831CE149F3AE7C18B9A8FCEE82985CFE1D672E9C30B5FA5924677B29743BE7BB7B73658F8B74AF9A8B021D41956BCB1C141F42EB98296B5AFB16E3F +Secret = D13423BB9304F980A233D44AD7CCA978D5B55927 +Label = 578B0514D35A71ACBC75D68F +Output = 322D2F7F2B2C60C4C7D056764B45 + +OutputLen = 14 +Salt = 8D62FF69BBCB91D508195DE7AC5B3E01479707E14F07081B62B916D384B5E1645ACAF1A537C147504616EBEB0DB5CBCCF6B9D5848C6202E153A16DD392A8CDCD1F531E324860 +Secret = F7C091E854CC32DE9DADD25CEA4C176AD0BD23A1 +Label = 3000034BD4CBF3A814D02FA1 +Output = AE0A88B71E63293F2A9ACE198C03 + +OutputLen = 14 +Salt = 63939B9B0D0555B32B202317F757898CBBE724718A2EF507D5FE894D3FAA1D7336EC56ADD3B4402FAC5EC654AB5DDD27486C67AD12AE0D200626E447816A76845C568E4C1D79 +Secret = D7015B9E24350330A71AEDA5A56EC016A9E13947 +Label = 02679C69E9003490027EEFB2 +Output = A7F1699F08142631380382A919BE + +OutputLen = 16 +Salt = 34EC1FADA670DE1D723071135A4978D73B8B21BDF74BA439FBF1C500F897D21D43ED81A7B87E2CE5AF76C5E146C9758F27985FD76162650A5A3F1C786F798252E2BBCAE91535B78547684ED86A98C702 +Secret = 7E66176D517C531A84C9F6699A51A6BFA45B06E3 +Label = 60A255C6B7753BDF4B53C385 +Output = 16238C5788A20B4CDFA5F026FCF9A5E9 + +OutputLen = 16 +Salt = 1D44DB0AA6FE1634096C707516C3C101217B85328EABFEFD63A24CDB77F3C10F398E7940FE67CA17FE0A3D73AAC63E38B4DBE1B8DE588E4BAF54FBF0516644E992D5400F7CE064600778B7F3531D85F7 +Secret = 3F7321A44242D2552B7FC1CA28FE615F7BCB6227 +Label = E06F2C41D29D76072FAB73DE +Output = B5D2DFD48AAB0A8A149BE9AEB07C4669 + +OutputLen = 16 +Salt = D04B241D6E255C87A442EB6341E341487CE431DCF0644CC8F50E5093EDCBA3C6B8A3C00770E88E7EC873AA9A711683459CFA170A8E48F15034D4176E3B313BBD82DE9D7F3109B1C56047B8ED8FADE4D8 +Secret = DA9E53F1C9A6D74101A8148EF072E8818D3120C1 +Label = BAE75ABFAAB84E82F9949987 +Output = F82CD883465476C06EC1718D523585FA + +OutputLen = 18 +Salt = 8B7350FD843A958453459C83E1DADF127C3B9F755B1B5DAC3875B36F3A37FE72334D59D8CB3CCCF37E0F7E52F69B8F115CC1D6B5F290B7BA7D0F54B22AD4885317B58BE07CA4C9C8779339DB58826EA2599A14C6E87C10B8C4AE +Secret = EB16D409EB597E1A95E255C750D3671A0261123A +Label = 4A11C7573F89ADA54C5CD443 +Output = 431945DF8CE57FF0AD6B35ED486EF2B4B5EB + +OutputLen = 18 +Salt = 7C6F95AEAFFB7D452832988F44C4207B7FAD94FA8B499292C0D48CB02F75E4DA86050A524918D4DD48D438B46F2FC2C1C797572337CFD9A08FCE02733D7E10539996CA1C0D7AB490EFF47FAC99F72C82A5F5359878078C3B88AC +Secret = 392F1F7CA27ACE8BD4CD63D45E4E486E855ECB3C +Label = F9F083EF265A15CA5E68F057 +Output = D21FDB92F6FA75433ADE11D9B32578547909 + +OutputLen = 18 +Salt = 24D46D68303C77F1FB3ED10747D8B7E01C93970BB0C070404117F362C535D1E92BF90FBB3869E9223957CD496BE45B89A6527FC39D45DE2F2D5865BADF20893AA9951DFCAF5DBF7FA46EC6946EF709B7A139D1D19041D10B6F96 +Secret = FCCC12309A15071018B2DE7BB775A1ACAA4A02DE +Label = 660266E0D0A5FDB78FC6D350 +Output = 79DE342C5358DCF29910D175B5CB3C2E5CD3 + +OutputLen = 20 +Salt = 13E3EA2CF37566A55321C8E6386FAAC93421D614948EBF5BBA07649D77A27E161021346BAC19B3ADE49D4250DDEACAD90E3643389C320305541B5C3CCE41DEA5586CACEB3D43C43B256DA060CB3366108AB7895C7AFDA46C68C09D63D49E74AD74B05D94 +Secret = 17182760595F697F27E4E64A8E66102AC83A4B11 +Label = EB5A279F6AC4522804FAF25E +Output = AFA3F9DABB5BE44C4D25DD83EB1C0983D89961CA + +OutputLen = 20 +Salt = EA31694879BB9BF021D98A0243855F1B934B4CE9AC5AE5C2DADF8DF73C3C8B029F2F9AAA88F846A20861830C819A264C316911ABF5A179F2950DBF09900EDFE804BD5FFC255788A60D4A95662D98DA94B825E01AA86D6330D8255A00A627A173C6ED868A +Secret = 346E9FFCABA437D22868CA4D93100500E576BA7D +Label = A14B4B4AFB0268D1695D9D1D +Output = E8E2161D3302EDFD913A4F60EFBDC6501315AE74 + +OutputLen = 20 +Salt = 676F255DBF8A576312DA3A2232D38D686E4F71B47DA3C1D120F3450176D85DDA1BF903E815E3C56E1D1C716FCA657774FEFFBB0A692724301FF75CD07B83B64E1F55CA9C1900DCF2E91356A15417F99D0A36C89328440827A7FD7DD803803E5D5394C259 +Secret = C79721AE499725BA11868A6B501721D21E6B5E9F +Label = 5B05AB73546BBCCB1B96B763 +Output = 53C570373C7ADEDFF13BA573BB45550192FC585A -Secret = f7ca5241794b7e6bb242414431b04c704f00e018 -Salt = 124690ebfad3486989a0ae06a080208273b0a23fd5b706b4084a059ac769e7668e6c7a652e155b5ebc4a8325d70c25c73805346fd269faec8937483b -OutputLen = 16 -Output = 81369f6d72726be58be6429deed8a4cb - -Secret = b279f2098a21f15d34b2edd452acec93985751e3 -Salt = 96a4caa2244b55d65448c1b701d3a1a6b6ff7ddde45777d04b84944035e4a6c37b156b8d504c8b039f68e78eb98d2e1ae7bd9a137e3576206883e427 -OutputLen = 16 -Output = 4f9443ce7c76b8b7752acb18b2f9b060 - -Secret = 5a720d9e92e76e47d7a63b94bdcce70a1e2e45ad -Salt = eb7be6f431c40c9e9a4ac3b2d511d7bbdb9b0e42ab6988a28d2333263eb86587fde8d7e5f733e204627aaec5ce5c7a83603612341b706c0f6b1ea95f -OutputLen = 16 -Output = 8164b4521bc9f09b8f4663762cf55b7e - -Secret = 433b7e6742bbd8040f7baaa7882eb3bd9e9408b8 -Salt = 67e84acbdc0cbca9c176a11ce6af5f849aa17ecf97349def6b69f79c149fa4094630dafc76bc69a66f1c68eb249c1de2674a681ac0e2522bf5e760c2 -OutputLen = 16 -Output = 84d2c95eeeed9ae098800f337316e2a5 - -Secret = c67bc860f8d775dbde482b02918fcba9c21ddad0 -Salt = 26d73e0bcefb7e1ef62b675c263b7905b86b3de8e923e40dde9ba8a05dde67c963a732a42281daa93cbb76aec6fe8d583c0a7df035f8207e2e72082f -OutputLen = 16 -Output = 98e53aecf42d67e92861c2951d9d4f67 - -Secret = 88a2b39b436a45728838014d445f162fa9fd7b0a -Salt = f6647876bf617132a07c5c1b49a28eec3c2b6a1074fd5142aae132d533e4a172cb166ea89b7cb1cdd164c6fc7f254a06035b2b1d28ac45ff0871ae04 -OutputLen = 16 -Output = 37808eb40af34454ad4dd6750bdc8e73 - -Secret = c1efb8d25affc61ed060d994fcd5017c2adfc388 -Salt = b92fc055057fec71b9c53e7c44872423a57ed186d6ba66d980fecd1253bf71479320b7bf38d505ef79ca4d62d78ca662642cdcedb99503ea04c1dbe8 -OutputLen = 32 -Output = 8db784cf90b573b06f9b7c7dca63a1ea16d93ee7d70ff9d87fa2558e83dc4eaa - -Secret = 7e925cdcbc2fd5b3213cba7714cb71d359936109 -Salt = 1f95a577958981b7477ca2a71d44e66564e5a56d8189542718eb1ace81436e16f4158789a46d19d4384e15555bc3b4ffa10b5471ac33bf904982f49e -OutputLen = 32 -Output = 557b5e1fe770b4c76ea0ccd31f5c1dd4ffa0463a8ce9fa04f7f5d1aa53380043 - -Secret = 98b6f0b4b7a822e8f567a32d27febda9e46217d3 -Salt = e08a61238719b21fb5f6361f215eb5a5603233bf73a101f32f0963974c0117fc22d024d8193f19fe095cc873afc7b89888cbe41762e7ab6e8b783a00 -OutputLen = 32 -Output = 5504793a62976e77b1f3f8bbebc5854e1538fa002a98af5b935d9850b65f9a61 - -Secret = ba3e6131cf924c0e67be01205de07cc8c77cb94d -Salt = 9d13b23fedb18bae4dfcf8c3f6070e83ea87a1ed20a4013737229e05f6c1f8f26b384a2ceda37d632595156abcb2120bde03cc3ae9f3e58bcd9ae525 -OutputLen = 32 -Output = 5a4841a14a12f04c65ad5e60c9f10e4ced3afe9ee10aa8aed66ba629d86e213c - -Secret = 5a3b55d4a4897a1f5ad4a3a5e2259ccd7b2ff62f -Salt = f02ef61961be2defc3cb9064f30f9fd7ca80174ad3f60e02dd7b64528b6f4018029864555d3ac03e4215cbddbfb4f258a26bec46507a9cfe055437f7 -OutputLen = 32 -Output = cb09826916e9b73bddb6bf25e6caf5b6856f88d51db351fd8315e29088985921 - -Secret = 7b9167e2f62f379659ac044f450aef7bd5e938c6 -Salt = f433e8f177d8fd5743ed5990a8a0eda19aae08db11db6f82e4e1dee67d699f9e11d29d6d7da8f06eb7e973f3a133fd54c0e40a445b5803d5ab366537 -OutputLen = 32 -Output = 44bbb6978694b107716347d6c674a634597cfc51a825b19c236df68c3f409884 - -Secret = 6f9d1e92a8f155c2c71ca9d6860fa4ded3b5e01c -Salt = d2eb8e67b3118569162850cd849732242c2918554c4cf861948168b8db783d45bcfdcedb55ba9ac90e3914328333b5f12cd5548edcb11e8bfb3f405f -OutputLen = 32 -Output = cf4e88bb3231f905e403653fe9661836a325a00a3914ebe1923562505a1f00ae - -Secret = 8b20d1f259c52ce5aeb06a824966955110145a8f -Salt = 43d9dbbf085414bebbcae8aaf890ab14a90fd925a582b010f9c3a08a3e10a897cb5ae809982c558b65f7c15fe7a316d5417f26c273075cad5701d15d -OutputLen = 32 -Output = 4e2338976e7832f16fcdf06fd3dc4bd777d170cf56f6a8e2117435cf05d2b5f8 - -Secret = 693b557c8fd4054a8176cfc31b681815dbe07180 -Salt = 8e948a3451afd83b6041576d959456bac97b9f93a3d133198cda273d846f7b8bc9afd19b8320c3c50859c292ebf967d88ea09124b333b1443163f18c -OutputLen = 32 -Output = 359b213884b0aa5650353a53fcbfbe5b0e0014f367cc2d430d7c437a3c09326c - -Secret = fff0fee2364b5596f7388ec0021ddba8ca94fb20 -Salt = 5e40ceafed97475454f581ecb848bad010af0d6783b32ce86bec57af6e5f05d6c731911f526abaf49596d5ff0b29c20bbf7b849eca058b1eabc60d64 -OutputLen = 32 -Output = 4bf749512e8493f2baec602bd1fb1df841cc92496bb28c05363f77a4f2a54ba8 - -Secret = e02ba5d5c410e855bbd13f840124273e6b864237 -Salt = b14e227b4438f973d671141c6246acdc794eee91bc7efd1d5ff02a7b8fb044009fb6f1f0f64f35365fb1098e1995a34f8b70a71ed0265ed17ae7ae40 -OutputLen = 20 -Output = f077c2d5d36a658031c74ef5a66aa48b4456530a - -Secret = d1bcdf028960195cecf478b9e861ea243962ebe9 -Salt = ec4b12610f46f7fe4411e39ab28619ebffee6dfc638e4e938ef1e04342d75dee121b375be292295704c0908aa61b488f6a29ab106468134e71b5439e -OutputLen = 20 -Output = 09d71d8aef2d34e552f9be25fcfa60f87f5db6ab -Secret = d1d2a910d689848fd220ff30177c690395842c69 -Salt = e8cefee65eb88095b6fc81d9313e35b490946f9f114afe236d5d89277740e500fe50c2b900b6c9139b0ad93f398801707189abf3bc73779d46fbc012 -OutputLen = 20 -Output = 60d8206ce28e33c67a884f0dcb8ab70cf55da75f - -Secret = 887b74b2c8a6eb888fc389cc2da1870f04047472 -Salt = c95fe491b7538a9d69e4ce3fffc6c79ad8bb14ccb5fbbfb0a371ed6c018640b96382a57b23baae3f4d783a3d21d5b9d9e111a244c960118a22269cdd -OutputLen = 20 -Output = f6602de3dfce074fe322d267c99a508a46cf2562 - -Secret = f6afa445041c7073a74c1fb92e915143f2f80bbc -Salt = 07511c89c68a9ed06d525dfaf84e5115e60789200f8692eb13b2069900c2f88aafcbb0b759a113e7fd65f7ef57913419b54dfdfcbfb48a9dd7b14d19 -OutputLen = 20 -Output = 23264c430fee98c67796483a203861adbb9c418f - -Secret = ee5f23363e74a7f46811bd78e306df6d0d546a41 -Salt = 2793b5a9ca4723093944b9d585744a41d4e037f6b774a94e8d94ea43c92cffe4e142be1539ef9b30765be3b8aca854bcc4f300de400c4fef345b5f17 -OutputLen = 20 -Output = 9aba4a847a411483be6ed032b10213f1058a2e85 +[SP800-108-Counter(SHA-256)] +OutputLen = 2 +Salt = 2D8C9FEA0B61911D5035 +Secret = C3981FD4820F6F6B26D90E4FCA64341446512BE1880D143F9824C4CEFBF14A18 +Label = E950EF415307549F329DBCB1 +Output = 8640 + +OutputLen = 2 +Salt = 78CF881708873D423E6B +Secret = A18128078C120163624C34C469F0070B077646ADA03444F581AB550E9019EC6A +Label = DAE87890C32602826E98C307 +Output = C95B + +OutputLen = 2 +Salt = 73FFE4213A34248DBC9A +Secret = EF317D97861D570DB3734CC64D19B23F061AF2E5482BD60EED50180B1010C513 +Label = 1C1295E57D062206D730DE33 +Output = 921E + +OutputLen = 4 +Salt = 54B5FF1F56E8382A128DFFBDD1935064A75CB93E +Secret = AC6E642F7617BBE17AC0B9D3448C68A6F5C4EE5CF6C24F4FC8D36196244D6CDD +Label = EEDB92E6AF837C518C25F016 +Output = 07CDA9BB + +OutputLen = 4 +Salt = D810222D74DD5C0CFBF51751D3A0D52BAB9F7CAB +Secret = 18F17DB9D79C606CAAD257A01D9B87ED0528EF86EAA37AEF40AD56E0A294B4F1 +Label = F4A953FAE17ECB8330D5D2FF +Output = F71CFC4B + +OutputLen = 4 +Salt = 070D4C51399CE6DFBD17E1F213A77F1AD902EF70 +Secret = DB4EDE06C704992D6B3F833702C273E895AD5863141FE54A2D6F0ACAFB466A28 +Label = 1B3B41A6E0512642B8A74E4D +Output = BB30701A + +OutputLen = 6 +Salt = 8D2024E84782BC9AA727B394B1AB5A11D866915DCF8B696B7711BE5CB6E9 +Secret = 22B9617DAC9A48CB7EAE8A74DCF6F1869D225C79E8E8CA4EE0317F2F9D140FC8 +Label = F92E3FF8D3A363D940109167 +Output = 66C55A93DD3B + +OutputLen = 6 +Salt = 31A0F757CA045A0C7080BDDEB963B1AC9F7EB28305D52F89FF850B55700C +Secret = E73EFDAE544ECDB5D314D41D3192D877FA344F50C8CFE5F51D52716B1560B7BB +Label = FDC3AE63280728B1448B2D88 +Output = AEBA2D6BC8D4 + +OutputLen = 6 +Salt = 7D09814A730D55A76C53988666D4C2BD596FBCA367AB75B8EE845DF5C169 +Secret = BCFA8E84AF34C560FF43A48F13FDCAA3E5ED0EA6BD8381C6510FA6B87D9D718C +Label = 90EF98ACD9EEE323DD1EF356 +Output = F738BC59DD36 + +OutputLen = 8 +Salt = E25A50CF430E0D3B0B451A58C8B00F9D607AEC946B1E6180F2E7B066F370710D004A4C0B02CB5F7B +Secret = 8F3439344E7E96DB71993D83E4E4C77B05179C6BEACEC5A53F7DE1381023C277 +Label = 73D70D740A98E6FEF15AFE07 +Output = DD408285FCDF4B7D + +OutputLen = 8 +Salt = CE5DB621B45D0024A7CA7C6A343E096F159DF3D796E4F96C214C206A3C22894F1D219501EDF3FF2D +Secret = 677327D6DDD714D863BDADD5F59F1F4BBB538D2ED959FD035BFC3F4B3FFDC1D1 +Label = 18F4665D273FFE86C4A9CA43 +Output = E25C803BC336C432 + +OutputLen = 8 +Salt = 6A9490C21C1E3C3B0AB90D7AF20A50DD49784DAB4D87E5434B29FDDA4D1474F2312036ECFD89124A +Secret = CBFE8A924F1E435228B55392A8B76DBD8F6165F5B62E6C6E6A17769346DAA9F7 +Label = 83B1C9034CC4FD11CA48D9A5 +Output = C9A51159FA773734 + +OutputLen = 10 +Salt = 3AD1B1EFA7E029FA57420F91C483AFB31886480DAA984C771104D9151AEB4881165AA0FFBFD99F211FC6E950A678AC87875E +Secret = 0F57BD32FD40F4C4865AA085005C3E16103703F78361ED30FE6F4C3DD26B7027 +Label = BF437A7E86F66FB3F33A58A8 +Output = 6604C9BAB231BDAEB33E + +OutputLen = 10 +Salt = D4D4174E978B3B36C06294A3263757E7562D03C0943E5758A8583A503BEF6EF4A5BB1A649629D5DE46BFF9BB54FC90A1AC4D +Secret = 3557F3DA3538A3CCB7F2C1CE9C4A61240B94AA09D67FB8D0EEFD5D30E244A928 +Label = CA662D47FB8D57C03A604958 +Output = B054021B454AF9783B34 + +OutputLen = 10 +Salt = 2D70A7289594D3D6752A4907B1AA080BA29243BB51CE95A0A8FA613269DAC851A2035E47F70BD976109DCC5331820F10822F +Secret = BBDB87903D302216CFF8CA2006F0106F9659172AC0E30E022E34EF09129145B7 +Label = DC4BB86E7CD392DD15030A26 +Output = 693C9137C8F4F0B05804 + +OutputLen = 12 +Salt = D38223F87F5F4624C022C64D069D50104CFEFFE618182DCFD77AD9D882EDF8ABE937664A7BA6B106A21D57B95D0621FAE58AABB7048E25E62E9F77C4 +Secret = 0D0DC70813B14D348386117472DDDB66FD575ACC79C3FF31F3282CA3BD58B929 +Label = 1194E13EDD8E18043311D744 +Output = 241A5CE876F0189D721AA0B3 + +OutputLen = 12 +Salt = 5BE2F29B6254B3CF169CC945DBEC31FD3695445AE4FB998D2B9585D416747AF1880406E8F9B0C82EA24BF0E5596C9019BE86F136BA7CA4F129055C30 +Secret = C099566A1341F26079003D67EFA0ACDC767125D6132A5CA7FC290E86AAF2478F +Label = D7A5189EA2AB5EDFCA379455 +Output = 427705040FFAF815372B9F0D + +OutputLen = 12 +Salt = 2976154F19739EB2A0E0740F31A177DF92BA291634344EF977D6DD23C7ACDD135B12697F720D9CD9337973C79D198040DAB1301B7C8FB300C24DB04B +Secret = D74EB90BAE4684368D6B1CD0E6C19E0C74AAF7B3A265D1A3EBA649321C33C99D +Label = C30825432219AA0FAC84022A +Output = 5FADBB9B62A6403203AE2CCC + +OutputLen = 14 +Salt = A5F13E33609B85F871665ABE2209ABF78276571077FFEE849DAC69138FA0097CBAC76C9A2BD564C6A7EF3A2DB4171BA0071F2311E153A3CA2386BCD66FA99086A2F414F4F67D +Secret = F8681D2348F73EA285537B67DAC118A8F96DEF754D61C90B03A4728F0F10764E +Label = 877FB61CBBFAC07688A73F49 +Output = 943063F0B1BBE570543CE47751E6 + +OutputLen = 14 +Salt = D638F6B69D7B3FDBD9140DCEAFCEE6F9BB78559C4E306B9C1ED30E6D7EEBD4A44AB891462A1772E019953450159F484D7D0F549C34AB5C6C9E340A6C806C1BF59FB1C5533224 +Secret = A53941D3F2E90F646C9C8B020978DE8D056A86AF1753D14CDCD24D02B45D2C6E +Label = 1AEA234F4D938D74A29ED384 +Output = E815F9B2ED571724CDD594BFD919 + +OutputLen = 14 +Salt = EE1E5DE0CE1C411B32521E57960F7D85DF974589DE31FE4E4BA316997B750B6C3CDEE90592EBDBDDECE200FBC44856FF1C96CFBC1C678E0E7AF0A28E3D38415048BBB11B3D59 +Secret = 16F3D351625B268D66D17D2BE1CEE5BD2E57D25EA84440C6EABFC93B5A8E85B5 +Label = 9B0473C4B3F67BD57B59EC46 +Output = 08891DF0E1D5FA42C5D7399F471F + +OutputLen = 16 +Salt = 61E3B97C7E164BEB2912CF52A5CA71FE5D02C70DEBE0C960BE33C9A5A097C3F4991A2A25CC97C7232482CDBB09CFDA58603390651B90361CF61D255C7F84A66646D145B1F752237B21D30070A8191A1F +Secret = 8AB4AF3BB75EBA85BC6A61E49F9FC4DF6B16497542CAC40DE9CA5193A3D73A93 +Label = 8B27C3749CB9DF85C4762591 +Output = 0858EBF134E37A82E14138220AC0437E + +OutputLen = 16 +Salt = 34B57CF770DD5094248780EB0732BC562AA196073B52DD2EA8289B5A793816F07B9536D8F57EED7E0B4CD07CF7518BB9659AF9011BBAC510913A03505ECF708416957EC41BF0AEC80B96B480DFCAADE0 +Secret = BC31754031F4499C410D909BDB326528D80CDD3CA93ACC7455B2FB1AADC1E320 +Label = 0CEAEE58E88EFCC23B784703 +Output = 09A9D7FB04E7A6453469231C81EA3A20 + +OutputLen = 16 +Salt = A4006EF0F9CA0CBBC63B1503531E7E10076DDFA1B097C0F43DBA4AF6EA78D217BA936CB3A440A78FCB316E8FA971D526791D0D81C50A0425F486801DD42FEBAA4660B71ED5ADA08963AC2F6609D2810F +Secret = 7CFDDD7612BEDA249CF8948A5D46197DD97452A7280F9CC1F4C4244AC924486E +Label = C31FD5F1FB64CD5910F6E838 +Output = 2311BA56A871DBA4270D3DC37A5B96A7 + +OutputLen = 18 +Salt = E9FA1CB0C41536A5898E7186174C8FB817EA0CEF44836F6FA3114BA4720B830FC0154C98A82B5AFBB6A214EECA5C030832B26D3729AF60D77B2165E858E81E0DD8958A661990467E5837978090BEB6B3B12C6D799054418C31A2 +Secret = 5557AD1FF1453209FB2A2CB66481FD414C94BD191C6A130CDD607096A4F9D5FD +Label = 39B21B742524B23E5ADC7BBA +Output = 242690BAC99F1C9928EF24E822A3778C65F0 + +OutputLen = 18 +Salt = 713219AF240846429B271D6FCCFC8681EFA660C2AD1FDF8F64FF0B4495074344CEB9F6D0C0FEC3D62384F0D2012B0DB5BB769592EE9D4546E7A4CADDA413858E3EF59555594BE9F8E248DFAA46DB920EE3E608A6A6EB36295D5F +Secret = 7001DFB9E4725A5B3238683E04819574B617EB82520A9D0A892A0E85B8361053 +Label = B9E638B4B3289F230245E196 +Output = C6C0A7FA4FC7317C05B15E04B7606E78232C + +OutputLen = 18 +Salt = 6BAF45A49F2D6756A7DD81A2D60A7FAEA3D7D940C6CAD8722A7B1E11F71827B842513FB0E901DCB57ABA207FC89BCA1FAD2780FC782EB3E4AF27A1D521A0D1BAE328DE37C0FEB4790F681FB3FF595F976836D6C1B8AD2C0913DE +Secret = 2BE7D57097ABC677C56463C60BA9FA4F3C28449416E8E947B87CF4FF22FB21FB +Label = C3BFCE3E1A2489B94039029D +Output = 6CE262F4AC854A1062D6892B29DB52763BE5 + +OutputLen = 20 +Salt = 945F9536A87A885591B2D1C1DFEE60528D2787911B680259F9F9802DAA5B693AFCEE134A24869735FB4C27164AAA80BED7518C9185471D7E7C83CDB093810F536F67B8BDBA87343D164BB3A65D757C8C48220F5FA959843C28DA1D7C85F6E141D55FCA8A +Secret = 22317B3E18850908A1CD30FD45F76D21BA7634BD29C276C6F62EFA35AE6DFC50 +Label = 2893598B5BBFBE27CEC50820 +Output = 43161E4C9D75AEB322E5DD1783A5650124BCA230 + +OutputLen = 20 +Salt = FDA316AC93EEC708F203B0EE0E158AA82BEDE173BB91F62FC211845C4787372A625C61441BDB94EED37067048C1F9F4407C679E29B70163FF30889F7CF04B76B7214A423D2DF5AFA32EF722407DA5CD829015A704D76A2E710E83F2B05FB7208A8D79E8E +Secret = 3E7167EB9A79D05F1647DFE5056A0753E2CFD188638B1A8B754D3B588AD844F3 +Label = 79FBAFDC757CC07EF130AC52 +Output = F0B6830644B54DB3B141773331B263EF24E83F7C + +OutputLen = 20 +Salt = CD922C879029E72D9AABC6BEF449170BD2520BF27D3C70E3CA0F9750473BB8F2A2EC972FA0524F8A0A2114AE7B48D3A2E67D216C081BFD425C0772EAE771886F079B80485813FEB87EFE8504F840E8FAF38A70B2898E15116C29B6DEEB88FA34FD75262D +Secret = D91A5DD68B69D00C018853426546CA1A56F3BD0A870E8F53D2A70727C2C43DAF +Label = 99B47AC07FF5EE2D7B9B1D99 +Output = 93C6FF261D1E7A6FF8B21DC658273F4F7399F376 -Secret = d20fd65c2a15b99e189274de5639b30d9d9db4b7 -Salt = 52d32fc17dc3827b316faedb8b8fde901b35576fdc87669a685f20b1f8b2de059f75634ed7b07bfde390fc970b6d1d686dfb60e3ba968a84f161fdb8 -OutputLen = 20 -Output = e9b534c532601378be46880716f797156b9496f2 -Secret = 8025b3590cd514c2f95de9cc9003ff825622ee30 -Salt = 170f08fb74da631d2a8935eac2e0cd59ff83f733d298930b6c458f7f8822fd621356861d0b98d0a8b137a1987c731199ffd4efbeabc99c2a65810f84 -OutputLen = 20 -Output = 587e581d9e59418d57eac0abf93d9405cf4335b1 +[SP800-108-Counter(SHA-384)] +OutputLen = 2 +Salt = F66A5F03BD8FB8E4EE73 +Secret = 30EBC364331C53CF98F771C4864CE8B00766893EEFEC211B5F4E5DE0BFAE06C783753A5E8F34380EF30C7E28196F51F3 +Label = AC1C2915AC20F5A301860A2C +Output = B924 + +OutputLen = 2 +Salt = 060D22DE4A916398F733 +Secret = C8C00543CF83154A8813D5EF70D0160712CB31D418A211417B9CEAC4711F7A26250E59162B70C7F87B4C478C66B552EC +Label = E3A13EE5D9696CA3B043813B +Output = DEE3 + +OutputLen = 2 +Salt = 945084792B6DDF1D16EC +Secret = A653D7CDB80FC4A2040072ADD8A28D8A049AAC433DF8F0B98AF206DBBD9EB7C965439F1EBA41D981AF46DA0AFE314F00 +Label = 9F2F49F13D0287BF845A11D4 +Output = DDA4 + +OutputLen = 4 +Salt = 34B97E350599EEB5205D1DAE3379F116B18D03F0 +Secret = D4880DA37BF639152A7DF2733DA99D0EB2CC740E1B6F4A8EF49D5005A6512A5602EDFAF49905583528A5E10B2C8A9C25 +Label = 28DDDFFBCFAEF1A6A33C35B8 +Output = 53A855D6 + +OutputLen = 4 +Salt = BF1C250E12F19293EF61D80FCFE118C5F06DEEE1 +Secret = EA3A910D5E1F7A58AB64C1297D83E2C4DA7FA9462DD21B19300D7F094A175904FF08B52689088F779B6978B87B5EFDC7 +Label = 899D6A6378A537B1BFA10F5D +Output = 3E2809CC + +OutputLen = 4 +Salt = BCB78FA39A90D5F7DD9A38FEE121D0FCD3D0A00B +Secret = 36E1DF6B6168DD90E42D828463DC8ED170BBB914EC6471353020CA111C7B82C085AD73E33E6565F8FA9F7FA2E4BAD9FC +Label = 0FF74E94DF773A65E454025B +Output = B601285E + +OutputLen = 6 +Salt = CCB07567F959120F28E0C0C7966E0E844BCC31B1054415BDD0DA19F7638D +Secret = F7F248D966477BB0FED27F1530E097720893892F243F456CB0220DAB58218B509FCDC4F0AB5C4545202A08B8AC8F232A +Label = FB6D6E273A4E2BC86179DE14 +Output = 016ACB55B73E + +OutputLen = 6 +Salt = 6689027B82238D095A17A5462D4361432F7FBB96EB39985DE71351D21EDC +Secret = CB1FD8EAE49144AD83AB6C0E8D4BF559173B7B63BB85673497AD6E2B7C1BBC9F56A27341E0C4AC952428CDCAB309E051 +Label = 509E6DFFA60802A52E80FD0B +Output = 7F61DAAB9C3B + +OutputLen = 6 +Salt = 9C093F3835EF5E7C4A6D7154840828C4FB126F01954987F26C4DF1783657 +Secret = F569BF5D250FA3577FBC08BC5769DF70B812894E4E4DA95FDF7FF261F42B4CC34CA082F66C3D6FF2DC91706A541CE708 +Label = BDF4B7789CB2FCF76AE97615 +Output = 07DD24093048 + +OutputLen = 8 +Salt = 15A5533C754D1D08C406FFB4C0EFFD7D7CB5BE05D0751B5C3DD2B02B9C87349BDDF7924AD2D395E7 +Secret = 394B42B27CB68183B604DC0F70F8E3D31CF63738C84297E35DB6CE942994BA2F96B27F99BFFADB68290CB3C7274E663E +Label = D3581FE19963D5F2D352C22D +Output = E84271E807E42F08 + +OutputLen = 8 +Salt = E4738EAD345201040391F2BAC2EC93FB6FF7D1D4E28804D76DE372BDC7F905CDE8FAA1669113E132 +Secret = D31D5167BFE86FB7FFFC25F3D875C6A7F7F76B5BAFE5C6D2C94097AF23C33181E026527FE39FCA701254C210BB05F61A +Label = 0D5F069EC31CF78615DA4AA7 +Output = EE191C25C375A5F4 + +OutputLen = 8 +Salt = 047B057C06396CF0B003C56A010B0FCA1B9ECA73F191C58C31872B7F365802E74EEC9CBA6DD77FD6 +Secret = 176B6C47BCA6B909CFC3B6F7AE41B458040D144E9403330AB00C0C1CA8803181BDF7EF7A140AD6B5B2FA5C6829A531A9 +Label = AA9033C56B1B5CF2B8D55117 +Output = DD8CCDFD5BC99C25 + +OutputLen = 10 +Salt = 0D51712432C298A545ED26A06D4492BCEE1B96FDD53130BE99FF80C90D26F214E91E6FD96C93187F66407C084E6ABDE8F7DA +Secret = 072158D2DEB08F3D558D6F32DCE0DFFF754B0F629F7DB4D395E843BA760C2511E1B6D768D97E8848390334E63660AA82 +Label = ED67F949BF8D13705D398E20 +Output = 1B088AF8B7C1889FC520 + +OutputLen = 10 +Salt = 72A132371519C75CAC6FBF134D2D0B3CD3B18A18F0EB20EF459A79054C2E14615EC791833BD9F66A8B82CE82BEFA88475EB2 +Secret = 959F0E0EE665DF65A31477FBB91A390BD662C0839C831F632BEB472FBAD4DC16E5495814103E8C506ED4E5BC5E68950D +Label = 2DD45C96FC9405E2358FE243 +Output = 2352FC10671FB3F2E9F1 + +OutputLen = 10 +Salt = 2C31945FDF20663426017E2C10778F02525307BE87041147440BB762CD41FA142A00EBF7F8213B7B182B30900105768D2350 +Secret = E3FA76F33C8C15B9272F43C5F32D2A41488CFDE3A170ACB09031E95A4CAF02670B42FE7710D7CC0747EDD135F1AF250C +Label = 6D37F9EC512B0713B352C859 +Output = B7B75E1BF8BBCCDC4768 + +OutputLen = 12 +Salt = 050ABA4957749A0A47C1AF8B671B3128858FFB8260EC68435DB163A23EBEDDC933140DA0BCA3047A08268ACC6D5EF6AD750ADA3E82FC761184867313 +Secret = 5498F9261C91CA90C8F42C9FC9BDFFE38BFA54FDB2A3D8BE5732A408FEC4BD32F3458D117EB73BDD7EFA7A091141FE82 +Label = 1E3E8BDEFF197CBEACA540F5 +Output = AF3F51A380EC868DB47E7391 + +OutputLen = 12 +Salt = A602C588D01B3B4109606194F36C3FC29960F086FF8C503CBCFF23422ABE627369FDBD5FBAF52004B92BBEBFD7B6194C04CD6AF89792B5B609531DAA +Secret = 56A59C86A742BEFA1458C45209BEB4D5BFD31681E5978DF7862C10229E6F590A6E2FF3A253D1DD473FF75ACE457AD31A +Label = 5539F01EE755873F175B65F2 +Output = 8A1AEA04CDBAD545C2AF61A8 + +OutputLen = 12 +Salt = C3F69ABA8EC040308E577355F0D845749BE84725EEC1333EBED45CA5BA3F74743385A60C8F4B84AE800475F0A592AFE9B814E5FB3684A2A8E2C8C501 +Secret = 4F030CDCBB768F3A689D4BFDE6FEB3F770A29748D01E998E933C16B2087070A74488CAC538CF4F5E84375164A6F8A9F0 +Label = 64474DA54D684161D309D367 +Output = 6EFE12410BDCF8FB95CE3EAF + +OutputLen = 14 +Salt = 31A96AC0F04EC89C9046DFA6B3A999927291180AD7B1BF434C4C69E707F3A430C8AF60FC5C669B8FEA899BA9F19FCDE07B4BFD9F852383921B3BEF7A65BC8B98DB698940C530 +Secret = 17B19E2770921E4FFB41437BBF354A7305C0B1A392DD9719FC126480C9D2BF56428445B7C97FAE922FEE77E2CADD5BB6 +Label = 91A069959415CC37BF92FA15 +Output = DD5A577A4C22822693FBE72B8970 + +OutputLen = 14 +Salt = C20EE31669B5A5CF45258DFB28C3F7E755FCB10FE971D3E4F3DABE7E91CD3AADD2BD264E84C562DE85D3C1609FD6C21414A7AF33B9D4D3E78495D45C3F81B47D87383F648D31 +Secret = 0EB3EF2905D128142398250B4DEE91747DA3E0E138E6F6C4453116CF80B7536CDD91DBDAE2D3136DE60D470A751F3B35 +Label = E31104CE036A7E87288607B2 +Output = 2E5FC57700B6D771AE059BDC9308 + +OutputLen = 14 +Salt = 2855E059E9BE6CF261C1E61A78F82EC5AB9AD5B7AF6006E70F0FC2FCAB7E3A90BAFC1C7218850F87D02E516D29B178F9AA6D12CB5571A671E69F4BDA5D3014003E6D4545C8B0 +Secret = 60B3C88011BA3055FD56417C69168CC157CB636A61356676764A475C92C7EEF0BACC974004420FCC86193346AC8D891E +Label = 5981C14891E847010146959F +Output = 95A0748ACB2030BDC7B731253C09 + +OutputLen = 16 +Salt = 20B8B5C78613B4CF47652D667B20A3808A7A082C047A6D7C5B22346E3A076C947843C6B84EEA35F7E343F1A817A567E9EC08909FCD02D06104BC729D2566FAE7F04A21047D65C5A7C110705A463A0B30 +Secret = 18148B335F2F968D6C1E51C5E7ECA2DC6893133250C0DCD2288F92F4AF5B370601D42301E53894F9166873FA27353616 +Label = 3E744E6EE2FBE88A7FE52FF8 +Output = A4502937D13F2064157AB9C80345841B + +OutputLen = 16 +Salt = 7E60691A4630CBBF66CE7F41E3A75E59FD6BD12755484556F5872F349196DEEBFBE6F9E35C6431001BC369A234F05C219919F5DE666923DA4B2F4447018AA46670B18074A1EB2EF78BA3AC2F5CBC454B +Secret = 52A94D07C1B0EAEB4C5D4E49C0E13657904D38E6E28ED22D3C6D9ECB3D65854129C8199A0A0AEE397BD007DE1366D55D +Label = 9F673BBB49629B67B442849D +Output = F0F6A8D9593445F0BC1AC378121349D7 + +OutputLen = 16 +Salt = 124059ABAE06C4D684F61FB9D70D08B50E7C98C7F31C4611853B3A25C5A183E00AE9434C8E075456711BBB0B245DD49DBD498659A2C9CA8EC7200B23D92BA60853C73FD1910C70FC6190A3FA96208A4F +Secret = 50871262EDDB38160336519DC5634D8D80F8CDD583E596206B53AC081789AA8D00518AC05E8CF246E20337B61A754158 +Label = BB900F8AB156DDE082F7DB9A +Output = 05710AAF7AC73C9BCD3F9CDC5504D237 + +OutputLen = 18 +Salt = 4D4D341BC5B4AA4D7A5D95765BD15DCE3DEF886657B7F0E1D2562C8BB955FC9D239363BFB89FBD5453D5CD9EE34A74C08E1797B4003E1E1C6C2DCDEAD07663EA96D762973A4F429A6C47C60C78D000C8DE22E811624C877060C3 +Secret = 4D70F3CA939420D4535771C4C3C5F18AE4A8017633839744899FB02C8A1835CC8D443EC8C37C274F3F24F657E37EC9EC +Label = F086EBA3F94E4F17790DA783 +Output = 80AB2E62E691479A875A2BD0D70A7473F803 + +OutputLen = 18 +Salt = 14FD0D74DEE84480AF5D3AD17712AD53D0EC7CF40212310942DC6790C4931055CB14AE84D7D5AB3CC1B68FE88120554E924D40DE450B44DDE7B3863A8C8B9F8D5B80ED50B33B1C4FE0835B9086C23F4D817DA5A362245C28407B +Secret = B11DF7C96AAC3BCDBC72E738C6D711015E7082B884D901DE9282DCA2E8CF44D194CEE505EB0D0D1AF62049F288715BC1 +Label = 3D9A52FC1AFA2C0222706F27 +Output = 226D94A19E98E1165FEA27524DC6BF7AEF4F + +OutputLen = 18 +Salt = CB14C038FB0C7B4D0715A1E53D005286C573F0FB93D203EC7103B80CD80C86B47CDDCEEB35F137329EDBC660AC83F97DF9185DBD5CA85E360FECA3846C036A8E0DDA3C275AC6A43CB87000CFCD2A31F5B7CF6CAC04E5DFD62580 +Secret = 1C5A356B4CE2DBE725B3D843079922BFEEC03B3A4E5B2F1CB2BD5F582F1E442964436F2E0C7AF3217F0865E503A802F8 +Label = AEA80CF74222B1C9C780A477 +Output = 16C8921C15E640B51FF8D9C9011BF9DB4BE8 + +OutputLen = 20 +Salt = 99A01CD7B3F4097371C94C0CFC0A3E5321EB67F9993FF4332A3C04936EF1C68209538368F482E5C7752F226E6BAE2E260788CA9639F209ACDB3ECBDB6C2EFBE440C8E8B8A5CD392835773FD164C9071A8650F77B8D3EC3D93E74AED950BC4B7DA1AD6F85 +Secret = DC5C248394FD89EAAF134C08A0F3D18B7D6960BB683B5D663ACB77048C4A20CD0A0A321B55E5D71CDC098A9C97EF2C7E +Label = 22032EAAF92E44D39E109EA7 +Output = E6E25FF61CD9DD9A53E709010CB06C33A4184CED + +OutputLen = 20 +Salt = 61A492F7459679F7EB02B629E7A4229FDFE0A93B9DC9756B44A1FB33AE2BF2B78A593545009559F2D29FDC51267919F02BAB149D1F30517CC10CD214D78D572B8338E84C10BC9782FD8163B4E0DCF4DF5752D65E6A02C9CA6490FD5BE26B1D3BCE4FBDBD +Secret = 0F83B50FF23F5EFC99A109111A1CE9F8AAB9693B59CDDC22CE1D579CEA328037E8284103EB15BC30A597F16D21847FBD +Label = 22E0368A849B2946F4F0C4DB +Output = 8D92BE0D712F7DF2506875C69A5977BAA3AEC5B3 + +OutputLen = 20 +Salt = 4F64DDDF0804C793207C76E6EF768ED654AA3243B52E82FE79ED3DFF5BBEB9865792156B467814B9BEF63DB6BE0BC899EA3656ABA80BFF145072F831FEAE41BC4B304A9A5385BED6A62DF771A63DCA69B499D4BD9F1E8ACF07635C51ED4117FF76E1F6F2 +Secret = 9BCCFE050258F32EAC2EE9CF2A53ADC70269ABAA952CC42CDEAD313F4033CDAE758CE80CF335632EB37CFDE945653FE7 +Label = E257EE6E8BAB6692DF1D51F3 +Output = 22DC12E4D8E251F66D2E242B4A1EB27458E24C05 -Secret = 9be97630193f094dec260d4cd87cce72f66dce58 -Salt = c5dfa14df472b472a4bca208c6d822e7fd46716ed1ae232cf335f6672335e1fcd40229f8c90e42e4833da0ac9ca3702e79576079050e1762c2a940a7 -OutputLen = 20 -Output = 50e16bc16b54c8693b91a6ad362b255c2a7c684a -Secret = a8fb15282f90f49937b5ed6427660c37b3069583 -Salt = 6570ac2dc0cd78465803341c29d73fbe5ab804b21f677fac533218ad967749fcdddd83f74a43839c64b073dad3b430a4d199527a794f0f56987ea917 -OutputLen = 20 -Output = 7dbf26fb3a07aa3ec4b5739f3e08fd2b2d1d820b - -Secret = 693adb9037184627ad300f176985bd379f388a95 -Salt = 7f09570c2d9304ec743ab845a8761c126c18f5cf72358eada2b5d1deb43dc6a0f4ff8f933bef7af0bcfacb33fa07f8ca04a06afe231835d5075996be -OutputLen = 40 -Output = 52f55f51010e9bd78e4f58cab274ecafa561bd4e0f20da84f0303a1e5ff9bebc514361ec6df5c77e - -Secret = 70ea0ffe1cd76df86b78150993abcf5f86e2deee -Salt = af780b1f4c00b555761937fc569533710dc6c6b76c1b956c9b02acf8727677d36c396ed1f3aa6671105c8f16c8dc75c1f7262bfb3ddeb80b96b3df81 -OutputLen = 40 -Output = 780bb40a387abf54a92ab91d24f3151236e9afb8e826866f4433c32f0c6be4ea347a78e2335f282d - -Secret = eea784c3e3181af8348385456878a775c3a41708 -Salt = 51d601ecb9cabb4c5cc6348983a1d24344831812f6d3559399396418ff8824b7eae36350bb40dd66ec0677f49b5f5ab9805cb272562ed5c7ce0b30c9 -OutputLen = 40 -Output = 2fd6dc21e31cee812ae3738cea9f7c2a121c0a0f4b985b1d506eff72fde7fb6f0948c92a86b4b525 - -Secret = 3be6e8a3ee32f99313a5b8a51e23e355812a4779 -Salt = 30c3f68ee6e2fa79e892680a699831134e04099f99acb76e35437ccdf1950efef3e7bdcdd15f5dffdf4825e288323fb7789eb1c54b38a6d8b50ee5bc -OutputLen = 40 -Output = 0059fe3650673c2192a8d7746b6efc8e069e42cc6ad9a10c46b6b741cc7d1df04be7e0ff805f0c26 - -Secret = 9eca5318091614b60a3e44f69ba28f411ea990e8 -Salt = 1079043f6f6dd21f7269a3c4214ab4d75282ee64f913e9ecc668192b6214fb12743ea9b687ecda79d4cd97c2f78d9267a508ff46b95b0c8f1f31aefb -OutputLen = 40 -Output = d8575b817887183d95e92ff4ed887e52ee15bd75820dc1a9ae753da6b97fcd6d82e8f457c2036770 - -Secret = f9dfc13f0413c469f04135fac630830f31ed82a9 -Salt = b663c6cde0e3b5b0341f1905d19d58ee2e8da999d788d34d4b8b4c091d97dcc73c1093169cc1d37948774fec2cf08964d2efd82f71a4407288a29c24 -OutputLen = 40 -Output = 4ca390ccafe9d66d4b43a02cc337c3dd74d7be5c49beff5ec4e139b2dd38ca695aa87b11b96031ce - -Secret = eb0a4598ff09189a9136a97bbf8718a0cd673386 -Salt = 17d388ae1ca1f603422e5e218e1aaa9e28bf24a794f073661327412206f2a2a6ee5ec0da1bff02dee876991ab9dbc69e30e7f2596750b7d974e21cb2 -OutputLen = 40 -Output = 0ab9fd6102904d02d1cc3a31ffd8947444d1a15669847184540b408c072052504e066e4c995a388c - -Secret = 18a5533df305e0217b622cd1db488574d835ff73 -Salt = ff2e2c3e28bbf915b15e58e59e5fc2a49705d7eb17a84d9b410a84f2bfbe493de705ec43491d570acbb958aefc4bebc47ae7b2bc189d42eea3c7188d -OutputLen = 40 -Output = 2830800c092c409cdcc73424a032456d05386fefa101f01d69d5414fd22caacfb23b9ccf7730504e - -Secret = 25c999c2bc65f3aea03a309dc8cc8c000a11ed96 -Salt = fa7c3d22f1bc8ea5918fa71ada7ac52eec0d3c19f25d177a3dbb14fb3f369f52dd35f5430600c877850870a2021b15e426744569136e3a075419c3df -OutputLen = 40 -Output = 1ba4ec321adcf193c10b3d09bec935e0286634c6579a95efd492e812d085cc93c53ad29582247c45 - -Secret = 5a254a0dada84bd3aaa5111a1191e654dbf9e728 -Salt = 3583d0b1d0d70f26dbddaa1dea74e4986285185ff21333ad44935bcf68953f1d6db4686c53bd6521c590ce9082e282c9493b2c7bc1f99d9f89d3eebc -OutputLen = 40 -Output = 263fe62a0442df8230d29ef860276d3a1a3f7e7216ceeb3813cd522ea2fa81b3e4aa4b08d7117975 +[SP800-108-Counter(SHA-512)] +OutputLen = 2 +Salt = 33C0ED9DF8C585FD7B30 +Secret = A6CC599CEAEDAA4266C1E5DB866476F798585D6F3E22666FBC0E5770621CE124E81B9D555476A87E5CA0778DF5FB9465DC239C8C574C83B8F5EAF3525495F9BA +Label = 4B05526629111CE011863B7B +Output = C18C + +OutputLen = 2 +Salt = 0FA17D15475BDF519184 +Secret = 5B9896052A171CCD2D3EFF955DB09CE9905C0C13482E64891AD63785618A703CBEBA29FF151D907884533F11CA9C759529634AB6811D94779725EF3BC85B2063 +Label = 571BF01C54025B0428D3F60E +Output = 0B22 + +OutputLen = 2 +Salt = D76ECB782789884D24DE +Secret = ADA10A78884D057675F1D5D47A018201206274FCBAA3A0E09456715A131C0AEDEFC7C877E3683D10ECEFA0587A36B32790BE232BE8EB2418F058CD4805A7AD20 +Label = EB109A89817C1BFE3D6DFE5B +Output = D73C + +OutputLen = 4 +Salt = 932AFB65BF0B0BAA16C0FE08024C4F9D82E92729 +Secret = AEBFB599713D9F727C7A1FBB0F4282474766DA970A04E80462C1C541C2E9EDD2E1DA8B25C3D68151EB1D7149C5D40BF30FBB76EA554A4E60099C9DBB855637C9 +Label = CBCC4646D02C5CEDFC3ABAB7 +Output = 9FE61E38 + +OutputLen = 4 +Salt = 62BB46B69CF43F5369142029264F647594EDB4A7 +Secret = D448A78A399C13B7501575F17B555D20CB261A92D19478532F3C07C725A2F560D23BA9042281CAF411810EC1A96A31701E979F6345DF5E0A406545E9A3C95B6E +Label = 77024EB88C5DF91E32E51E3A +Output = C2965457 + +OutputLen = 4 +Salt = EFFF62908E65281138498BBF5FD2BDC335B9A6C9 +Secret = CA09F43D4BADA7AFD528F2848CEF50209A42A30806441AA07EAC1465F72DCC034351D111C461A23B7C43DD103C806277839574C697D8F2E93936DBA2084A9A49 +Label = 0BEE621355699CE10602A6B9 +Output = DEB740C6 + +OutputLen = 6 +Salt = C52DA0E1902AE6F6BB9154664FB9BE481995F2C50549ECEBEF3D94E0071E +Secret = C308F4C3741C516F8694FBE8672143A6EF47F19F73EE7FB6A2BD67543650EECD5E0F836AA3627F07B35D17F0BA37F0B84699C79E84423287D08D1476EEC8348F +Label = E4435DB9C50C9C6C8A6DA706 +Output = E8E9955F8B07 + +OutputLen = 6 +Salt = 22B6645A5DE097C980B2454D3E4211F3B5CEFB561820005E508BEAECE00B +Secret = D842935BF79FC560944965C207775B707735C98F8209F2A19C8A1778B2CBE034C29B50A6BF66EB94670AFC962D6826C8C0F800A8E3769946663F41B2869A1E0C +Label = C6203EF7325990F0F1B60E43 +Output = 5CA2EE61DBD7 + +OutputLen = 6 +Salt = E5C184857333E4E97ADE7E0EDCDE8B948B34620934C8B4482D5770217887 +Secret = 8A07E63C5F1237D263BAA49A234CD7D94A6640CD0DC3101629C3195154128A0C60C130954A6287FCC46969C46162BC5C9DB8F9898F42581B37BC9F721C0F08E7 +Label = 2ACCB52E2CF1534D0B1E86F6 +Output = 7035FE0E9814 + +OutputLen = 8 +Salt = B7562E0519F1E6F45905088CF76271EE950285A1BD7250A077F836F251019829EFE63E67E295968B +Secret = F49AD223C0008FC876AA9216676DFB52D07A29C8E627C6DA23E0F97ABD22756C9F1B688F52D0E70C995496685C478E228216D3EC3AB270465B34C900AC01C645 +Label = 40AB62392A4AEA8328534CE1 +Output = 82D3C164A9BE1E68 + +OutputLen = 8 +Salt = 924B3F5479E877986E4950151286995C59BE655508DEE55965D243257269181F4C5F63CD810B03EE +Secret = CC2BD16275362E6D797D80CEBF459CB824C4713F64918B77FB4144F83A8CEEBB29EE8545219092BA5D94FF1A128401FDC59717C716209233913604F2E1A05171 +Label = 3B271B41430A95EA1B878E2A +Output = DEEB2B902AA31D76 + +OutputLen = 8 +Salt = 42D45299D558AAA52423B8DE7298C48FA6BA134C39B00982A1ECC66F1CB5D3B47EB713AC91A98DFB +Secret = C062C9E3ACE4D40CA480E38AEC973B12A2D361FB9221CDD2ACE17073C856AE834846F200AA184C7F30F13495CA19734F28D1992B55298862656840ECF48DB399 +Label = 13F5FACC0D9146200A531BEE +Output = F76543B2D5DE5A9C + +OutputLen = 10 +Salt = 4F4C0556214F8EB8F5358DD0E89255E582780A728E098DE65B5B1F228D7CED8C41E813CCD3F9039A4B81DBE6D5237ABD3AB3 +Secret = C5CFEEC9BA6B1B6107424EC2937356B25DEFAFD3AD3641717781100A0D349BCEFEC805414F58291926155D2E84AC076CA1B98791137E5208CE88278F62A92419 +Label = 072F7AACDE47D2D9507B4AB8 +Output = FCA57B9A651A1B3DA457 + +OutputLen = 10 +Salt = F5A6763197BCFC11985AAC42681E696A5ADBBEBF201FC400EA54C4278AEB74B1DD44B646AAF5E9A3890731DCE71CB11F2380 +Secret = 120165772C93653F3AC00658D46B0D039AB95FFB198ABC79591EA994498C7265B977CB94321CE8A3077BFD2056743187FDCE8F79369B1A1B14A4FC03AE4F62D6 +Label = 986A342FA4A8183A82B6F3AE +Output = 5E06575093D9C710A455 + +OutputLen = 10 +Salt = E05E2B1DC75D98E6C2B34AF38F0EF76F971DA22ED7ACAA938E8EE091506DAE634C6CBE886F1BF6F78226D3DA493AFE769F10 +Secret = 8DA812DAECFA0D02F6F2A873DD3B67C3D93AC59F2168045F47053EE894F830AADB8722B2BC2273AD831722C8E275C8430A2236850EE4514E4CE7960F34DBC600 +Label = 9CF01FFF4605665D310D01F6 +Output = 8D53FC57167A2C2A62F2 + +OutputLen = 12 +Salt = F612488100C710DB1DD71688F8881B285B8E54CE608A1D54A9F8C392D6D300D9F290C7BB3CF880DDE9A54C6DDF13BABCF07B7469CDC543835FBD9469 +Secret = 46BDE80E68548245A523607F71FE6CD7061B662227592BF5CC041CA92F31AECB049F9C1091FE294CE45A045B5A5562EDA0A057233A92E64D5C4A1813DF565727 +Label = 6C8F015E13AAFF83E0F17AC3 +Output = 91163AF9F1F21285D459C4BC + +OutputLen = 12 +Salt = 7B187C85A838E8DB5DFC9981D16D65BFEA3680EE250F037D940D45FF3E48A34EB82129A5DB9ABBD01337CB0931206D92ED1AAD8B95E58BE40718B8DE +Secret = DEC1EA826F25D2A82526A4CB29F5B859E9918C98BB95D572971EA996F3B0D9678D06867EBF3592394A57836BEF6525EB90BB7F5D0CD55C3D81013F2BB1B2BC9E +Label = 4A1086A6DD9698E7B5C32C6F +Output = 3AF56A692A5BDBFCFC52C2B5 + +OutputLen = 12 +Salt = D1FC0AEDB9F1CB1D5461C2E00CEF320E5273810BB165F2F8E2314565328B1040B351BA299FE46356BD3C13D0C18EEDBB795FB63FA41AE6D51800BAA7 +Secret = C5EB1EDAEC27B43B9C9470F0DDF27A0FCACB3AC38DC28B6A6D429F56CB1A8ADA8B28821FE147E2B8DD163AF13E6D5AE6D220ECBF5013060BE12585B854412CAC +Label = 5B775AC78B7486A815D3A345 +Output = 3566D67A0410976B7EF2F242 + +OutputLen = 14 +Salt = DB548EE9900FFF9590533780FDD700C1E5945B7857D278377CC96686D0597A5C7EC23A86E20C30C19CEBCA483EBBD3CA39F3E8603679A793B4230C3AE90D476FE80EB4B3440E +Secret = 26319F38D9FBBE0CFE6A34CD405E9258BD44CC7F14B6ADDD64F7F160C37881C62109C89058A924FA9ADFD7029EF2FC3C0084B882B32EBDF7337F83B12AAB2381 +Label = AFB1A048578C6C74745F36E7 +Output = 958FA25AAA101C7426F3B7797829 + +OutputLen = 14 +Salt = C78A37644DE0C9D41861BD4E4FBCDBB2FDFD8ECA6DC71BD13B085ED1C1BF3E45F6FA54DEE15081CC7201376501BD52D6A2E4C1142E35A1879B48E56D6C47BA6D171327357386 +Secret = 61A4774E6121DC731632CC4FCC9581932CE50615BD8578C277F3F546667024C3CABC11E6C0B49778C518BE5B76668AE20D8B940BB1F92C26C39BC5BBF295A9B7 +Label = 374DC59015288F37236CC5DE +Output = 179464AFE230B3DA500B8001CC63 + +OutputLen = 14 +Salt = 2102F29595E9E7D80D8182BECEDC8175412D958ECB221C2F05AFD2689A4122F0EF8251793E3A6A00E8FED90931A5D21817F2C2299680D07D2B8527B147218DEC17DD4961513F +Secret = E6823E0C7896F1359D161496A03ADFC2572FCF6869E78BB21288F3D87B38B6D016EF5F2F64FA023A5FDFEB2456C94765348DB35E5C47AB001E9DE6789CAE3424 +Label = 5AD36CE72B335F4DAF8EDBDB +Output = A218B010FF0C03BC7A7FA14A35FA + +OutputLen = 16 +Salt = CD8B923ADEED766ED13395D58E7091CC6FEFD5C8DA7C7C4BD09DF552734EC2A83E08F1C2AEA5C0639D91130DCCDA138570402CB41BA74B22F78A206CAEB0CD0D5A2512B3E5F3F2D12009A61FDD0C45B6 +Secret = 74E933E278A3298AA058A8ABE4927E1902A2AD324E3525F6E06DD903EB7B7DE0E1EB1E0166DDC74EAA47BAF576947AEF5E90B9E87103FFC0172323AA8502DDA8 +Label = 7E54BC50E2CCCEB07A8C85DB +Output = 5F9D2701FBB0A452344CF0624E3C91F5 + +OutputLen = 16 +Salt = E77028694620A4D7161F376C01C6F8DC775CF527996523BDF74B23A1188E4AF61F106F5DCC40B2DDC3E6929CBAF60D4CBE8230C743A38361610493EA494E1892A92A9C66D4F9BE7E286C9C8EBB53D9AF +Secret = 229F5C63258FB167BF0A6DF896B6EF2C92651AB75AE5F60CD665713FBA8065396C5D90611AB02392045C500D97B0608DC634AD68E936ADA437BF547751FAF4A0 +Label = 6371EC10CA720076CB7AD827 +Output = 19DCE8A66E42697975BD55F166A701FC + +OutputLen = 16 +Salt = 3FF76CDEE44D6DEE06239F5F54005002A613055AAAB8AF7D137D69272879D25EB920D37DC9EA939C7EE0A9361727AD43088BA6AF1B6C378D1ECD73237542CFE309F56E01C6CC82697FC5E1995DF55EAA +Secret = E802812B906DACA75667A7B681C0828DEE6570A220D95341BD1F0DF45073E877F0FB8E49B006466AA84EE6205AB5F141E14F3A6AA406D3BC5815C005973D1670 +Label = E006182F4D43B2EFE4F20820 +Output = A9DC3A1A4B37A007FC7E87EB3BA3EADC + +OutputLen = 18 +Salt = 2A2621CD3310518AFD6F36955FDD0F794FB0B0479218E0D7660EEF4A9BE0B852C11CC5A26E5BC4D1F733B1750999E1B4A3D5542C9D1B8C35B089B54ECFDCB7AF73474509B4E9CD718A497B2CE1328EBB039EBFE3F8701930A373 +Secret = 6B65F0EDA7AECAD580F912F43D48E9A3D6E61882E52483F38D0DBD8DC69D4A60E574F1E6B50A7EFBE239A848711AFA3BE25E47994CB19489AFE1C1E384FDD7F0 +Label = 77E628F3776CB7F32254CC08 +Output = 9E2A3D466B0357B290FDC783CF5031C1FF44 + +OutputLen = 18 +Salt = C5076FD31FF27607CB04160EA79A641F78A5F0B547D5D5FF4E56B0C7B06B83A797992858BDAD026DABA940AA7AD4281AE377DB6AD39F6E8DFF313F3B97B649BAC1423A40D4806AE888EA07165903C020A6F68F01E4890113E5C0 +Secret = 36B140A3BC53D0EC4AEDAB09222B72A690F0B2401FCA7BA6FB979877DD6397E840322464F4EEFB32A9694658D5FD435A3EAE0867A88BE38AFF1F5391425E54B3 +Label = BDCAFFFBB39D319D4C90927F +Output = 559D449EC9C3491DE306F909FD0AF0450939 + +OutputLen = 18 +Salt = 51338913B3C9175ECAFE550C88428027D75985144E828B1F4E8B098F4424F271D336E7AFA65F0D3306ABB114E0CFE8B5A5997B3D8D23C79AFC6AE9592A2BE13158E20D24E95198DAAF39C7235A91D6CBADDFE27CFC18AE4BCF3F +Secret = FE724CFBBEB7D1108D6B2456C10EFDFF36ADFF5351BB78245FFB64070FDA778301D602756ACF6CE83F93E1F53F2FB9D2B7DC59ED1BD24A5BBC807C889A1B3BF1 +Label = A88E632D27ACA9894DA78C81 +Output = 854E01BF1C651E5BC638AA65C9902F0A75AD + +OutputLen = 20 +Salt = D2A217054525DBC2AC92EAF5CF3E2D2E5F066E3FB7920A8736E835820B4821E5CC02C394A867149D9CE4A2D469063821701E293ABAFE77F557D270D38E74A2A0AE5BAD452C7007B4E16F789FC5460A375CD51DD4FED591BE285A9110588255009688DFE2 +Secret = C6E799CCB57F89065269C2B7480CDA4AF3F65944F498B166A1291BD9C169F20BBEE408C775A9BC00011093E4D9D3E9B98E5ACF5AEBA5212278E96C50951B2737 +Label = 30AB664413EF387B216807EB +Output = 48819CA2F44848D00EB9237924B82BAE6DC59A2E + +OutputLen = 20 +Salt = 17E42893512C6DF7747906508AD41396096A13B7D9AA87C4F7FABCBD9795165823A1B54819EB190691C96BAD55AD233A85F3C554C3E9B2D9B588A9F0DA09DF0D83D6141B83F5A62190FD16AA20B15552C3417C96B931E7EB55E06CD57406D5AB79FE12A7 +Secret = BFFA0F4267D5F24F219151CB38C581C0D1CFF8EFE475D7C38A47726B226DF36E47E1A579993B4BEF9E3197330610ED57350BDE57EC6EDF231BCEFF1532017C0D +Label = 196636113098B35C35406BB4 +Output = 40595AEEF8C541A9C453E27D38F6F04463331A8A + +OutputLen = 20 +Salt = CE671BB39F28FB3D4C08F5A0072953B0C1A60D2C1FE6547632DA88884FFB61F66F6EBDA9FBA60D6DBC9084D6414C79A42579DEB3B145B01B87E8BD142D84305872588A756D0DA65BC1D5A5388C08D89C7B23EBDAAFA96599101DF7E4801BB0331285BD04 +Secret = 999E5F40A42B5AC6763C057AA6778399B9C9F1B0A7955E1753FA4BB5CAF920180A16122C6D707F0EB709CB1903A8D886EA92738417FA988FDAFF0CB83977B98F +Label = 74ACE6E9AE7CCABF9E6D7D29 +Output = FD9BCB8485AA4D67B6B72724107777EB36D23677 [SP800-108-Counter(CMAC(AES-128))] -Secret = c10b152e8c97b77e18704e0f0bd38305 -Salt = 98cd4cbbbebe15d17dc86e6dbad800a2dcbd64f7c7ad0e78e9cf94ffdba89d03e97eadf6c4f7b806caf52aa38f09d0eb71d71f497bcc6906b48d36c4 -OutputLen = 16 -Output = 26faf61908ad9ee881b8305c221db53f - -OutputLen = 16 -Secret = e8d17992e2d4ae357ea4aed0b2b0999d -Salt = 99cc1e086cc9ff55e017f42b824f3b4e624e8398ea6d9e2ae680679058471a34c375cd2c3c30624b147750ee9aac3e3646c6231e5792575d3ffabe2f -Output = 0afb1efa155325a3fdd3e91262c0832a - -OutputLen = 16 -Secret = c4ad9d487d1210f11e550c7142a81e3b -Salt = 996b015638d704d416bf529e8df1937294ed8d06f5ce9cb416905663a8958344da04d311e41ed48077551b69b7234482fd8e8d2263241c60558194a2 -Output = 35124976f21c6de9d1c10ac256b9ca0b - -OutputLen = 16 -Secret = fe13cad92acd1542f2ef7aa1d060f733 -Salt = 5b7a0b35db1006534ec2f8887057b8c7b324871604a34ec7087d160ddc0b4de71239db8d31d91c5189d4f002acb6b3b6f3c684fefb6ef12f6c8f6721 -Output = 38d3bea39ff76c1c9a9ac0fe0b3ac08b - -OutputLen = 16 -Secret = 6ed6eeb3c4cfe164d5b6136fdd54f2f2 -Salt = 8fbd9f23dc387c6c2b1cdadc5ec3d5ebed440aed73f76216796c0e8a63416a1013561b61db1f47130162c828d90f9b456ba98d1ac0ad605ace97c8be -Output = 067c45331aeb703685eea4accbde0c04 - -OutputLen = 16 -Secret = 6ee0468cd5944e2a80efe000f4a54e4a -Salt = 457550cabc3802cccbf3bcd5cea5d274eb46396ac5f3f274fd7a07e0a789c0a1663445f054ffe744cc092077a1ba1a5a49b3744cb2208e9cb37318d9 -Output = 5570052e5a6072b0bb4243733c2b7317 - -OutputLen = 16 -Secret = bb8f61b29c6c4dca6543dd860a8f1df7 -Salt = 9465bd0611793d40e77ef8c3a26eaa4dfeb52f1b22c252a57a25e37a01ccd555774c7341484a747395d551cfea1de8ac7e8959ab9dc343869a8d8469 -Output = 45a98a0a7161567f8fa219bfef412ab7 - -OutputLen = 16 -Secret = 097911547a8baf410bab0803b92bfb66 -Salt = f50f12a768dc54514f13974136964801744f5c9873fadd62248fd3089b7f800b101948b02cdd55f5dc8788343658c3963141a99d64f399e210bbd219 -Output = fbb90e031afa4467d6b007b32352a071 - -OutputLen = 16 -Secret = 53128285b1777cb0e91cdda5b70c8ae0 -Salt = ab152a5bfcb1f2df8aa9dec7baddd7216edd28914cff52dc012916db65ecf33717fc37292d3aaa0087e6fbd4b0c1704b77bcf8fb3165635f33150b72 -Output = 7586833636ac24b3c4973dc016b8af26 - -OutputLen = 16 -Secret = ef12b72cb54f76b5d339d241b0b3dcc7 -Salt = aa65ebfc07cb18907104d05a8d6c0b35c3c0b10a3a1f8fd07e573716edbede7b407d1ec14ef4993e103c329615858dc85f7b5dc0f7384b1ede0de041 -Output = 62aa44c084da27bcf9701bba9e231a0d - -OutputLen = 32 -Secret = 695f1b1a16c949cea51cdf2554ec9d42 -Salt = 4fce5942832a390aa1cbe8a0bf9d202cb799e986c9d6b51f45e4d597a6b57f06a4ebfec6467335d116b7f5f9c5b954062f661820f5db2a5bbb3e0625 -Output = d34b601ec18c34dfa0f9e0b7523e218bdddb9befe8d08b6c0202d75ace0dba89 - -OutputLen = 32 -Secret = 009300d265d1f1b28b505dccc162f4f8 -Salt = 5ac373d42ed92427d8ff6cfff7eae13d66d3c7e536cc749859e2a49e3eea2ad846c9fbb7ddd99a1e6a54a89a87db98db6b8229f577b552e09aeed5e6 -Output = c666d91f931606882bf214ebe79cd25a02810c7ab6ced75cd3fabd027f0de54e - -OutputLen = 32 -Secret = e77ea66b59e4b368ab6f93d82f831759 -Salt = d002b48c424d6ebde2387d09499e522a947d50488a28980c13e9213097a31fcbd6bdd01c13a1598b8a1208297004121d17fbaa2623a691158eea6770 -Output = 017155f1e69580f408f5c4e0a8c08347ad8aec5a3fd6d6f1465729d290ff66f8 - -OutputLen = 32 -Secret = 618eaf90e1c1a6dd8a043dd58211b57f -Salt = cdff20f41bbafaa99af11332aa5dd1b09965b3c54f80d0b4981ce6a35b79c3206ab8fbad0d3a749729d27091cc32d41b1be98bb0b3c2c30450f09328 -Output = 9b2688ef508a3c5bffba6ddd4534bdb93ad0407979f1423d512925da6eda733d - -OutputLen = 32 -Secret = 77c33e23443737f53c83c8462cb52c0a -Salt = cfc6abcbf33b2fd09264477a6bb527d25f8e9ce200c31696d869afa0e4ba438bf92e9ae054361bc783dbc19075bbea129d016b29286716eb854f298c -Output = 98d7c1ffb83e5854b50b86c4290bcc30eae17b31723e200707b44cfa74e2a9b0 - -OutputLen = 32 -Secret = 070b400756aff9a4cce8dc21d6b25cc2 -Salt = db38990ab332440291d4a3beb8b0569bdfe2a231c9696b1926abe07dc8c77642e621e7aff61317ffe80e316f1ddbd06bda50751652eeab7fa34d4320 -Output = 399e60e91c6a5b4ddf2c531eee4efe61dcf8fe53432d7ad59630329479716f50 - -OutputLen = 32 -Secret = 6b76fd298e53c34562417a62ce10b07b -Salt = 8997aee4d45479cef0a0a9ab886454cad3ff2f050ca8c7380ea999ce628527e9c303d95a45638ced3ecc65d818f95c4b579515fc7ae3f061b71bcb4b -Output = 0b9676a481466ed101516c6440cf750ad4fc6e26036e40a28058cd0cbe176791 - -OutputLen = 32 -Secret = 1b7b0fd4461fded48462d78bfb09ff43 -Salt = 109bdc0cae7364cd9fd639d197980f744345d881112b69e62191bcc480c2913ae518a23b844e9f9f5b5ab095dd619905edd68a479e421643ad1c1247 -Output = 00e77ea147f4dcbe66160a8ccdea2eb7d05aefaddc9f06702f8a1f1d7ecc691e - -OutputLen = 32 -Secret = 26550bce4844cfef5bbec7ef303bb004 -Salt = 29b4f52d3b640a286242995aafd53cf8defbc9c29b3f125332ac28dba6659d8c73784448c74725d2d083e978417fb310a714fc814564d933e41665ed -Output = 9b8d43250a53639356989b5aa97404bb0e4a2cd3a9a53eb9b8a56e27921eb5f9 - -OutputLen = 32 -Secret = 8e6d857c17317cad81294012ce72625e -Salt = b5a2479fd608beab53cebc1010f21bf85d340c65a25dfa19b052d86c7ef0e377b5b74a6f6d9e4036b04c2130374738ff7d85006c393fb7c8cc63a25d -Output = b07a8301becc684bd2ea7908702fea5574fcae9cfdb063693947b366b8ab117f - -OutputLen = 20 -Secret = b523ae21fc36bc58cc46e5a3cda97493 -Salt = 8dbe6d4d9b09b2eabd165b6e6e97e3bc782f8335cb1ea04ad0403affd88a5071db5f36ce2e84ab296261730b2226a9189d867991fbd4ff86f43a3cfb -Output = 530211df01975dd6c08064c34105f88a6007f2b2 - -OutputLen = 20 -Secret = 96e62b44ba3e6c4137a1c601832c96bd -Salt = 395868261e9678f4283f2d8376864c1419072b35381d964f3124f5f324e5c739b3aff2e50d334579240a5c09e5c6fd97e654c4ffa60aea529514087e -Output = f97c65ae29149c14e282d82191d65fcdf2f88f7e - -OutputLen = 20 -Secret = 102004b39e9db3a1914e96a57d7e32ef -Salt = b197e45ff15613674f40bd9bcf96f8ea778e86370f25827d403dab1be28485b3d1e585e22bba397491781f34129b66a506745d531a46166fd8a166c9 -Output = 749a98c1c0580fceb47115515a85cc0dd8e44943 - -OutputLen = 20 -Secret = b8370d6ce91c0b08f5819d099f9711fa -Salt = db2ba11d70c2e2bfa302100c851293741993e2fbaad5f00628de622ea0b8846461a3b7dce6a778b898be71ea68a2e59f1bff6958f448b13e854d8c7a -Output = 2cac935737ac9c42256feae645654a3f27ee4730 - -OutputLen = 20 -Secret = fd898769b9a27039391f5c4b50201721 -Salt = cd3b0786f46fd115fabfe892c0db92c5c35beb6dcedd8a289429781a56c716922a48953483d3fcc70038950a6283f0169a80a5885de0663ed028e97c -Output = 213e98ab4bb2ca429465a7cc034ba5dd627ed0f9 - -OutputLen = 20 -Secret = 43fc31b7f19edfedb7abab3da8be5e06 -Salt = c563b43d4e6803d7a9899ba5dddbde09483c58ab4a31aac75932229b8e96c3889ac618b9701b0f0c094744a7dcee553fbdca4d6cdf7c7e8b792704f4 -Output = 6b1c6fdf49771fa820cf82380f373a5cc1775e62 - -OutputLen = 20 -Secret = 93832dc1d606dc1dbd83083601c1fab0 -Salt = 7738821d9685a8840b99d54442674fa9844ea966c235117f208ef7ee783e13322e8354046b4941f7cc2aaf43893f79188f19af3648a240e13b0285e6 -Output = 44b6a5c77f2b5ab65e8d513aee2eafda64923fdd - -OutputLen = 20 -Secret = 8e2469682015a485bfb109513a08e4dc -Salt = b973971271820d79e88079d2ea4a6951c88816c740cb08514cf614676aa7277d1faa9668e448701402581bdc7dfdb9f9b8760d7329235fda795749c1 -Output = d38dcc4572cfb3a8a5da1e0ccf9b990436bf29fc - -OutputLen = 20 -Secret = e98aba669480c570737377a8fb8a8d4d -Salt = ad6c6e553cbba54c319dbeb553c752ef9c3b14aac4d13e8f0d4d62ad493a6c1d489b7926524c9824ea7dafef7fb82fb634e27124f82533740dd17911 -Output = ae31f9c7cf8a9acf1dfba5e37c8f856cdffd538e - -OutputLen = 20 -Secret = 7b3703234dfe2bd7c007b2fe12033aa3 -Salt = c71f602913ce1e9f9f43f2ccce79016f46703992bd44b8046f2117619cab27a32c2093ffacdf30682adcc50b2a2dd6ef7223426e7c44445fbfb5ef84 -Output = 731c44d7d9340646053124fa207a074ad85f3258 - -OutputLen = 40 -Secret = b2fcf854b1029888aeb0274ca09bb21a -Salt = a6b84baae7a6ceb1d63ed704757500c510c0a8bdc22d2f42af09f79c815f37f33b67dad0b30f428fc1e2d355f7f91f65acbedd2fdd5b8c38dd890407 -Output = fe4c2c0242c5a295c008aeb87ae0815171de6173773292347f4f5ec07185c3f860b5667c199aad55 - -OutputLen = 40 -Secret = 9739110a8c4ed7fbd443b1c997330ac0 -Salt = c64526968f5b0b22094765a70174d9d5943a077aeb3d0f9e020b2d0e65d489c16938f82739fa0166990cc682c1145cfab42ef06609a99c5f7088f54f -Output = b88dd8ba7b92e70878269cd478d83d45675fcb8d48b7edd4da8824b18a1cbac95ac5176d78850327 - -OutputLen = 40 -Secret = ff77fa4ac9e17abde5ca2ccdc5eb530b -Salt = 661e4ca4a35320b39a088bb7d49b3e7818c0b7ead69565d963893ade82ff6d24698ebf1912a4cc1d8c9d47ae705b9db1389f5e226044fef929d3d0f4 -Output = 248c0a09208310b0256190a2e2ff5f319bbc7630cfad298b84270923e4eadc08d87f93b25dd2c25d - -OutputLen = 40 -Secret = 54b03eed49bba39b6d7aee1eeb0ddcce -Salt = f1484686766124cfe2d837db15fad36b4b9aae8c3f8ca1203b91c7d7a04814b19213a01d291b040aa6ef761c4d2dd1d76550a5ed0cbf8e267d08cb4f -Output = 0fa850459c10d190fa2a461e612c07e1c6ac67e3f3e535786aaee085ef48102009a9541e8f487d94 - -OutputLen = 40 -Secret = fb6915727a6fe4e379dd812e2db4eb0a -Salt = 7543f1a2de77ea0281dde51248c1b319d84eafaaab6c2f3ef29a2ddd5f266364c5607a8491ba368daa07403dac63644af4cd045c328d690e3c8e8f95 -Output = 24244e8398d34125c39a597e1be83912f528b8b331197fc6e486c72b8871a86f94414c48992e4b22 - -OutputLen = 40 -Secret = 5b13a082fabd6ca091777fef27cd57ea -Salt = d19962ba31ec2d916c8bc24c925bd447abe4af4d59609db0af133ba9d4e05a488a9ed6e33817af692376104a6710db97774dffd2c7b5fab6f27ef6e1 -Output = 1350e5d236c9a2c0a1066dfb68be0b2a2eec94f52d968d29f71410326bef596c6ac798a3e5917bab - -OutputLen = 40 -Secret = 34bf915cc20e1e45e6b339b2e7cf3712 -Salt = 152c12709adfe643f49356602db6df8c72698f9435f6d9218b54f61c110c6c36ba6ff06b7ee359cecf332df8bce8837c1bac653acfaa20e87b854d4a -Output = 1df3f384ada009951e9d70544629202d0c1998a53974a6f674ef31933cd49f1d602cf5845a3446d7 - -OutputLen = 40 -Secret = 1ce189ca1d1ad7abfd34e7a03e548983 -Salt = dba0b94d49f4aade4f24908094815c8d45f1089043277aad9f8d1962a6437d130a5d489ddd5d4eb7ced5583fe93f4007831596f270ff5c807439fcba -Output = 85dd7aa2caf27325f03352fc3ad68f7549912f601228377fb3322d03d48a331d12059023629a2104 - -OutputLen = 40 -Secret = f5b30bd08f8aaab4ab01d685bed62bea -Salt = 640913e9f9912cda1d664a596adcba75524f549852613bb4fd02eabff3525a4780a09c1b0252843d709820445cd92f4cabccccd39acedbe1dc317870 -Output = 6a0c9d6418fd60cc361576c806bccd0801a4b29ab8809c61f6b5a3315777aba0b238231342575b69 - -OutputLen = 40 -Secret = 2429b3366dd76baba440f2b2df365a12 -Salt = 41f2d2a7b509b46ccfa22698accc29d610ec393cfa3063ef46e3ad35b8d92adbae0216656925acfc7d1743747835ac1c01629f714042330b63dfc5e7 -Output = 26908cb0e98cfea4588e24fe71bdb4b81cebc4e9763150fb36195ae00d37c8a44760d9646e8ec671 +OutputLen = 2 +Salt = 715CEA804DFA4D1A97FD +Secret = 1434F0CA01CED247B4E57C4191C2E510 +Label = 6E660E852E809D3D0F9D1988 +Output = 9FC1 + +OutputLen = 2 +Salt = A0A3C7954C48DF9A86AB +Secret = 5300FACD33C4AEC9F0C68A7DEC198DBC +Label = 712DC17761ECFE40CFEBBC51 +Output = 4975 + +OutputLen = 2 +Salt = 48415223486C51CAE148 +Secret = EE4284A2C859E28252FCC2DA6DDDB6B8 +Label = ED5CD581E276563846C45D12 +Output = 8797 + +OutputLen = 4 +Salt = C0712DC1B6A7568589B3E7D1BE76CCDBFCDA1D77 +Secret = 2193388C70E7EA3483E5081C313E3ECC +Label = 4785AAE3D563ADA51614B20A +Output = 36D6C682 + +OutputLen = 4 +Salt = 24D0BB945EF2BBCC30250FDB70CBC389356D8139 +Secret = 4123F60A687E770242B647E1A5DD71F1 +Label = DD320F65CBCAC47D78F3204F +Output = CFB6813E + +OutputLen = 4 +Salt = 8C1C3301812793EBA64E39E983C6B50401CDFA57 +Secret = 43B29A5EE5AFFF6F5B159BA4951FF08D +Label = D512FB93969A664F9AF413B7 +Output = AD778420 + +OutputLen = 6 +Salt = 86D76086E0672812B0C7B84F395F5B2298500B40ADC6A3999BAA7EB9BAF1 +Secret = 70B387E0B8013245A0B4654EC28F1D13 +Label = 9AE727A0EA8243F83DC14335 +Output = E781867862D9 + +OutputLen = 6 +Salt = 3B63821261AB267195CDF2068D2290E6CFEEC669C9D07FEAD9484BA2F964 +Secret = 497B5B16AFEB27DEA3FABE6F81D318A2 +Label = C46C1AE5F491CFC36DA78D98 +Output = 7F964D4B0557 + +OutputLen = 6 +Salt = FE20A616C01029109BC72D67A7E65A857676099AD572B013330A8E006A10 +Secret = 6213B2E5E0D3A1C9F88351DA90F469BE +Label = A5895D9A9F6B37DBB2CC8ADE +Output = D90936C00D4F + +OutputLen = 8 +Salt = 918A552A0AF4887D00DB182980EC60E7E39B79EF7678C4485B1E64EAFFC8F1F532AACF69CFBCF47F +Secret = F0CA6C2DC10D3BBA2D3715782C365CF0 +Label = C9AEEC9FAECF17B4BE88C385 +Output = 5786116E2C742C3F + +OutputLen = 8 +Salt = 1F2D8C3395AA73E7C69D7C113007272FA912B7041B2477CF62CBD9558B0BA10F9FB995AC235257BA +Secret = 3FA8961D997442A48FF2423E8AABC2DF +Label = EE5E1DC8C89350DDD1B8AEF6 +Output = 398F98F498A22173 + +OutputLen = 8 +Salt = 9E4A2FEB912CB95451045B8C032E6ADE5751C40EED5DAB3EA0E6DFBAE99FA0F0DC0310BD4EB23655 +Secret = 2D499E34B179D49D8ED81D8118376DB8 +Label = 5900459546832BD9363A4D01 +Output = 419131EDE4327950 + +OutputLen = 10 +Salt = E9E37A345625037AEF9E5BE3CC681AA89C3358713A5DABC9D6EEC2CE303A3CDA6CEEB4369EFB5511F2B898DEE52EB33DE72E +Secret = C9AA7AEBDC9CFF6EB6D9FBC8F2744A37 +Label = 2A263D67CF55E63437F9E57F +Output = 81AF6C25D8D80A345374 + +OutputLen = 10 +Salt = D431432AFCB71A30C5238951A49E2D91F0598F65C7862D6F0F4B086114854F162805DE2189AB89742C30ECBBEAB115AE5F22 +Secret = CD82657E4B6DF770E01A936BC3CA622F +Label = 9578505BD6D48B9E8C1A7BD9 +Output = 8781C79D27025A51E68C + +OutputLen = 10 +Salt = E28E791FDB05FE5F29799BF61B18F3BA8208B497F0E557E7561764017412E465A79F104F20E8E08EBAC3B3509C155E20780A +Secret = FF91A69E76D0AA2EDA5614C1BB4C8A5E +Label = C6AB6F9290073D154CC35B90 +Output = 119E14976B7A9E5EBD54 + +OutputLen = 12 +Salt = AFDE92883EFD1F5EC778F6379B892C739D6A73BB9FFF0B528CCD166FEF0C80CD7FCBBD1BC25DFEF84878BDF047113A4ECA8AFC6C8375F9FB43166F62 +Secret = 97C6FBA19F32AF7B97D5EECC7290EF35 +Label = 0C2BA79FACCEDA9F127745E6 +Output = 58C26089DDC69DEBEA1DCCB9 + +OutputLen = 12 +Salt = 2A0055A4FEAB7BAB6CB3165EC5A213952D3C9A965E3D0DD7D17797110719BDAA16BAE29252EE769D408B933B642BC5B28E95F398B30450AD43871314 +Secret = 14DF17494135409D76B3010494E31EAC +Label = F5A4F919E85C5B8162B0595A +Output = 13E4CB2ED6AFC68EF49FFBE3 + +OutputLen = 12 +Salt = 4D75CDD260528F1479C3B859975F7469B572536421CE07ED8B0408D826B83743D198FE86FC93A632E5B43866748D2E0A6066E279256C61E96F665A6A +Secret = F86875ADDB720F7E05F09666A106F142 +Label = 0775E5D01A5FC990B2E0CA29 +Output = CF676B927B2105905E62CDD5 + +OutputLen = 14 +Salt = C5FB4C12D40F000B85C2DCAE2674757EC2D7E93AA10538750137103EED087D05BBCB571FC207B24B40197E243CC17D5E9C9A9377955679C92B63E8DFEEC6F8EFC765C10148BA +Secret = CE099448ADE2C95ADB3E27E48F4D826D +Label = 2BE68DEB481943283619CE94 +Output = AA32DA593EBFE61B8B87B2EEBB35 + +OutputLen = 14 +Salt = BB9E6F75F638D4810D39A3FDDA02EC8E6CC4297A631E50DE358F86EEF28641C7775D877ADCA35FC90F1756B6E539AB01562D3550019A99B2727E7198EB1B77E5EF5AD35D5234 +Secret = 9956A9E31155B899B53D7B73CA1432DD +Label = E6AB7CCE2154CBD5452D9280 +Output = C48323E243DBCD39EA45B74A5FA3 + +OutputLen = 14 +Salt = 1E387969DF729DAFE8BDE6308478081EAFCE130D1B823781EE6EAED809B27240E982C02E51C435E5EAA48B50291D43C7039D89DA8693DCF882FE258CF574BB0F37E6AABA18CE +Secret = 74E6A498A4F81E3F8DB42ECD39F154AA +Label = 8621DF736DB9AAED2004C53E +Output = D9FE05D08CB417133D44082C1247 + +OutputLen = 16 +Salt = B93EFB62645D028FE53F2639F1A5AF99A0BF9F12B147B6E0643432DFD1ABCAC371B8DCB17B8C1048405FFBEC930B08A09026584F2C6809E97576CED5CFE9910CF7556E1B82521AE1CE47FAC614E771F7 +Secret = 7138BF2EBEA287CF4B2BC2516871760C +Label = 23374FC2D009B56B976B257F +Output = 3862EE711131E43D26BD162919EBF01A + +OutputLen = 16 +Salt = A640E2B8DB2E68595BF11112EA19F9A5E7BACFA3C4DA4520BF4CBD2F9F6269E29F2E3A446FC85B8A2A21B1DE24EFBEEBCB7D16B95AC12D696F9086D0BF7180BD98C448B05BAA3F765C531619F207E5EF +Secret = 5B8F046924C0ED88DA9370BE149D97D9 +Label = F68FC892A41BDD645F9832FA +Output = E9FA31B803371F23A0557E8F05C36E79 + +OutputLen = 16 +Salt = 4F6A31FEF3FD64CDA1B8ED337FE847A7EE1407AA55E9088DC4277A3297312874D1E336180CA091719F67002C80F78051F41E86ECD998C22DCE8A0B5FB9BEE4E010DDF01B3CB4656CB46699FBEF8ABB6E +Secret = 162FC2B72FEF74D415E2F002ED90966A +Label = 48351F9FC75E6E7E6C1AFC49 +Output = 2768770ECEB6557ADD1D9D149BE30044 + +OutputLen = 18 +Salt = B08722EF11B63E7226393C584D1972D30E80BD5458BA3D75575371816F8B20417DF6C7FC5936AA7C08EEC1CF4649AA12A15FAC1AFA7CF7B65D3D74B8F605692D54B63BE4B27FFD93B54602140B40F66A30E9BF58A2BC68A62D9E +Secret = 08BEEEEFC876A885DE2C0D4D700FD127 +Label = F6612D312C0DEFEA27212D85 +Output = 6530582A6A91F0782B6632F880486D37D7C8 + +OutputLen = 18 +Salt = AAEAE539A865F40FF7F2D5AF6EFDFE634DCB20C605646A1945877EEB469B0BDE43F80C88C26904C48EF7863858864E34624380CC785EE5A9FF423CBA7AE7034EB3499D5D3E698C8FD826B10BB2DC3A62BB29287123440D2D72AA +Secret = 9EA265A0019889A51ECA294D49D44A83 +Label = 668BC2052CBA249C8E4AF112 +Output = 58E130370F1304807FB144BF61E817139AE5 + +OutputLen = 18 +Salt = 6CB5445786840386BD4215200344730F33C646CFE9C41721FB6A6FD9A79180FE6388B1B9ADDE213BD7DCE76664F8D48AF97CFAE6A258B73B55F25AD0D9852C56EBCF28BB56A58A755C2F7C68E1CE8A9E803C08B37F177E74FC6D +Secret = 2A1E994E0B101622A00F96079D022E0C +Label = 73F0E79CC41B7E8A03A953D7 +Output = 3415CEDEA07DEBFF2845364D53F510D8C612 + +OutputLen = 20 +Salt = 4AA059D33D1624986308A72231002EC4234B8D7F68659DCF9537ECDF3ECD9B453F32C6DDE39FE5A0B0E29B4A7A7C8E0AA4BC4E45B21E3FD10DCC2EE0BA8EE1598DB700C144375838C0F0E79D3BEF082F58FB0564FF4C2768738EBF14B2261795D87CEE5D +Secret = 06FE2C2055809E397ECC9C501C2FBC61 +Label = 15DEB162BCCCA77B4727ABDD +Output = 6591878B6D0E06EEFC937A25455ED4302530A6C3 + +OutputLen = 20 +Salt = 1EA795CDDDAD25C1F8E6F59611AE8D85FD9C125EFB4D0663B7FCA2074F87B32A685BEBB7368319E19A2D9D6390E8EF9997619ED177B9395C15FC27E3FA4B4745AC1AB7BFD855E57927BDD4B7FF070FB9D7D9FBC55269C904372871D078D80F4E2FBCA26C +Secret = 93BF507EB69624949FDE2322E8094881 +Label = B153EBF23E7DEB0AC582134F +Output = 5AED44EE18474D9FB1A2AC9339B5A4E47A57BBDD + +OutputLen = 20 +Salt = 856B81EDE6DD769CB445282097E815D3CE471932EBC77C568B59183ED0E56ABAEF3EDD62782F99E5D827D8C77DE4FD16A7026DB4A851A4A274848F7B45148F04EE8E1CF33484215B05DF374CE588B6DDEB87D9CEBD2F8128C983B922ADDBAA3B4B3D1EDB +Secret = CCE2E0C1E4724CC0A25287C5155F93E6 +Label = 7FC973E5093CE50B169AA575 +Output = E08B7663361647BBCD169359E684331EACF6261E [SP800-108-Counter(CMAC(AES-192))] -OutputLen = 16 -Secret = f4267280cb8667c2cf82bb37f389da6391f58cc74deba0cc -Salt = 34abbc9f7b12622309a827de5abfdd51fb5bb824838fcde88ca7bc5f3953abdcb445147f13e809e294f75e6d4e3f13b66e47f2dfc881ed392e3a1bf6 -Output = 2d1b4b5694b6741b2ed9c02c05474225 - -OutputLen = 16 -Secret = 186585f5cd6174e4969a3c7b0fb8eb070b87f1634a2ffb75 -Salt = 4593adcf4bccf3fd6dde143ee533ef12ed6cb8883df20d98806dd8b4c45db81231ff1a3b63ff559d7f3c233eeb87a283f8bfe46e9eb7bd55c6730a2a -Output = d661daf98d543dbd2b84abfeb5a12188 - -OutputLen = 16 -Secret = 353b27f52a947ef83516f63270c30a39a59d407bc6844de9 -Salt = 95e0f835202440432a995101fb3632ab72abf8258d5e99331378f00eb5effe01c841bba760e47e47574cff1eed2dec10de522c32fa0c72e84dcf54b7 -Output = 40f5861135b585084d43003630217fd5 - -OutputLen = 16 -Secret = 124661e221100bfb1757396caeb566e251f53dc7ecd48864 -Salt = 70674027d8b8ed39b58b347a231bd77d6bae3cb9538a56664d2264f297e490befef0a3419fb32888058470d9ad1d6206d512d1cf7603db8ed80b073b -Output = d09e2091cd35eaaf42083e6cb4ef1976 - -OutputLen = 16 -Secret = f337b81c2dd6e82db3e6a0b78152196c6b36843f490d488c -Salt = 2405acba62b02851a074ba0ec40fedefe4144b92047429bdba4ddff94f981370dd35a011cf562d928a22a6771b070d0ed68927cdde213308cf0c412b -Output = d270271ed6c295f929db49c47b2454eb - -OutputLen = 16 -Secret = 031e34421b9c12fe13d80f41bdb082a0ccf8e7492bce3684 -Salt = 80bc4914f76dff42dcec8869d717ffc60023a3c83bf111f00aff6429a39632691ae533ec1409486c557ed7a1409aca94d61e0a87fd947a291d8fff54 -Output = cce3b7369cf3672a9f3d78bc9075371f - -OutputLen = 16 -Secret = 94c72df2390c70edc01ab47ae2943a0287263149307329d7 -Salt = 0ba2efa9ab5f7c594bd115518727c54b247581b11ae9141c89e9554e1a7f1428fbee19ce24378eb830d182bc8649b6ced8c41137cacbae911a068978 -Output = fcd3a270bbd64163fd53cbec8a7b7cb7 - -OutputLen = 16 -Secret = 370b3aa730be3704d627e2d3937c7501d753e61ba75a7830 -Salt = d5bd68905999abc1209a0d5e11bec27e8478271b51073d401449fd73b2406a8e25309a93516a088dab2cf68054a975b662bcf80d39bea1417af8499e -Output = 5804925067b079dfc30f28d85784a892 - -OutputLen = 16 -Secret = 04607d8d173fa6ee6a97ecfb181ace209419ce56da9a1a98 -Salt = d93de40d57486966cd0923809dfe9052a4eff9da6e666f778b63a4820e626e77be823fa416b64e0a0873372ac88c1be70d5f5e8e8e49ab2bdf38fd37 -Output = a76b71d00c86ef68f29e8c38066104ff - -OutputLen = 16 -Secret = cf1cf4d939a257af75566a68a85fffeed9ec21150b2d5789 -Salt = cb42377f1f16549e6e625e91f1ab5d34ffebc57b0061edfbd56684fbd05da8954c2c849cd62a8cfeeaa8751d1d273425d3c24dee9a657547c70459d0 -Output = 3ab4b8db007d88bb41e4beb758921aea - -OutputLen = 32 -Secret = dc866a038c4f78f22d46caca65892bcdb15c1eb49b275827 -Salt = b4a123bad4890c7a791f5e192bd8b6e9c8c3620329f99249f11e1eb517a5b27b9e5b047a6591b45f6fff53e6d04b32d82e052af2eb8519bd21c10f93 -Output = 731a2e23ab2e58551490254041ee8fabd9c5a1918d76307f1048535be0763b20 - -OutputLen = 32 -Secret = 0e4c9f828486972e734524eab6663b9351e007284b63d3aa -Salt = ee03166d6fccaeabcea4c94d4bc43e7fe49fe26d2bd55479233397611edf26d541427956a86aa8e41128787991915a54c46945b7185cfcac35990baa -Output = 12640597497f67dc76cccf2f851c9e7f09a2d258f02b6d2334890df6ac4f15ff - -OutputLen = 32 -Secret = ae2bd60cf0376c5e3d44d17d3b2872eef79b429effaac07e -Salt = 1459178212f47dd1f9904b7240523b938b79c31f895fc85f25065d4481ee887f4e45be719fb136cc57cb90dd6869ed9dfd63c24e6c1a5e71f5f4d171 -Output = 73caf39c9f7e14c9fbd88dab24d944e25e437b471c9e0547c180e839e0500d0d - -OutputLen = 32 -Secret = 66edcc8c78e3d8469d3593738af576ea8760dc787c3d1fb6 -Salt = e86fdc237257f72e80e3133fb4fd47b5d6ade0c70f4523756b33d917a1111a9668c5dd6c062cda38704e216c5a3963bff9506234d8ab25e2f4ca9384 -Output = 309f651ec47397efd09a31746af1c05660f9a4fbbc992502077ecc6dda668a20 - -OutputLen = 32 -Secret = 7afd6ffe358c9b3291b29064817c3b8f84125231eb9e45ad -Salt = dfa2568c8c96c2936eeb9a0070a5f35ac037dfc45f9c90a5e990ea8132fe3e0b5817ee35b98d37982d56bb6458d64ee38837d6e7833728f6cbe8153a -Output = 5e11249c02a661f730d62bd6f7b2513bfe35a56f7f590a367683cc31aeb2ae94 - -OutputLen = 32 -Secret = e0a4ad9e8715dfd4726bc7385ff156c38cc63cc6cf8a2fb9 -Salt = 82871849c13cb19eaaf90957aa1604272a5acf55d84ef240d611a422f1ab4aea7116298d63be32fcb8b7c23a3fb8146aea32a6463d18d29f6e07ec47 -Output = 69b3e9ce07fedae28afa5aac066a0bd21bbc37d87d81a2d55bff77485f8dd5e0 - -OutputLen = 32 -Secret = 51fd1f5b95b13216dc1fed5b835a652df6daebb5ceae0756 -Salt = eb874f94d30016cfb430be0f738742ae34b63060dfd7520c2ef8922c1fe7a83a48e5a39bb25799b23cfc1c06ee1e436f29d81977cd124ca750af8a72 -Output = c23ceb85f336e5539debb5517be7b18a8b79418d4242cb38b37b26764eab77e5 - -OutputLen = 32 -Secret = 1d055febdca1e6732479f035e508c4ed10b0cad397202b0f -Salt = 6f3aec42f7cfaa5bb8bad34b88543ca989637d14e3082afea8f6e100c1d2f770dfc1c542480cf0fab1576170f127e2da525ddd12b7b8db0ec8615ddd -Output = ef3f866cfb19a63b1ba20e49af3423ca0efe16e42ba091b23da253bc3599e7e4 - -OutputLen = 32 -Secret = 925a2ed7b906a523557259de7f393df1846510f34efae6c6 -Salt = 935927cd274f0ce16462a7c8797681155b243d88e472443eecf090a7b0a7b45e9492cc7265fc7956b3ca8567952af247e0e69c9bad7c1e5b9ca9cedf -Output = 5b11d695c7afbc1661b5c71fa83c287c0acb612fb1d98fbbb702184518a0c5ba - -OutputLen = 32 -Secret = 627a17b0e9b9552475f040237b9472ae2112dd5cc7bae5f2 -Salt = f71d47c070b1e236fddeb70f8f97b61a439d32a99a0268d7c22431507c288ba6e98d7f0aa1e7504044c8deb2f20be3b7dd23bb63e694f5e1183c8c36 -Output = 3914e67d6860389b5c4b9d561b8d32e0aab03d0e003f1542ab95f194b566d463 - -OutputLen = 20 -Secret = dd5e0f1a30b0b722b00626ee663df29601af58082708e18c -Salt = b7c6eb48c80b071080fd07a827d0bfdc781599862084f7ffd968a4cbff0be9a6adef5ea206aa8af4d8a85705953e33cd7c4cbb69969c73698f54c6b8 -Output = 84e1ca286776cda0784c4fc48b054384ca565d17 - -OutputLen = 20 -Secret = c2c2260fdfd6e99cc52183569d977ccff507e75b957e5a86 -Salt = 3247bca27d20fa863a162375996e68bbb3951c0d7e9f5f2d542b54d0925c7f430d883d2aff7cede5ced8e64ce5a7a4511c6e5c77f2dfe2ba917394ff -Output = 7f4d7ca015ba5ad4e8412dfeee4b83483ad1f501 - -OutputLen = 20 -Secret = 9363276f86593c7e74d61506071d1b8c69f2de18d74bf629 -Salt = 8444edc5a1d2bee3517c60b710e3c89b1d5d0797a80d0d0a064a2aee78152e0490d7dfceb41327cb8f9f1cf0c0bd253b08c5334c8cd9aa7cee33a368 -Output = c9be893701138184c28d26b869bf61c97eb4425f - -OutputLen = 20 -Secret = 3195dc56413ec6b0048ec3d4a9f83cc94a23b757e3014ce0 -Salt = 02ab20b209d9bbcd3c3094077dee3197760731fe5b3d2dd059a66f6fb0e53aebfae1084d72af1051da08095f03bda377136021ba7ca20a3a28051b08 -Output = 2e25150749c1fc0e610d66dbe2811244f8f78bf1 - -OutputLen = 20 -Secret = 4488bfbdbd3f30d914de80791d1399bc0f57e792bcb80003 -Salt = f563657ae90a1d8fc049de7a5a8e985aa38114aa5aa4cd9a894800b069b497bf86df7349f98cf55e53b7623a1c0763d7e76608deaa79d1ed9cfd52aa -Output = b7928803f928109995721519b07daf7e9ec67bf8 - -OutputLen = 20 -Secret = 225e1d8cdac9eeab46bf3450fc1dd0d5e930030276a692ce -Salt = 7adc2ea905eda7ac90dfd4b367e6473e5720354696ac104fd4314415569b3a0211268043c1597c0b710c0b89ca799a257eae1202c41161821f44bb4f -Output = 3631d8a395baad6477180e40f9e2001f77b79040 - -OutputLen = 20 -Secret = cd7028002083b5a981ff80f3cc3c0f346f2f3cbabda62363 -Salt = 387c9a6d8660c7cbbe2b068e30b4983bdbccae6ba2811f6c98705780404c4463926faa9ba3e87da1b3099304298655078a7269debf95f28021186923 -Output = 802d7d8131f476e372d4d1a9e7502c595527f02e - -OutputLen = 20 -Secret = 55be60f622d25475d7ee83b648e85cf128389ccff8cca041 -Salt = 6e02a94815dd0f6ef5cf6b29c111ad46b5c4db1d92b444b5ac4762d8ceac8a426ca6c876cebd34695c61fcf50d48b08435b22252c8fdf2c2c4d7a516 -Output = 3e583500989d080dc184964403bf06bf3fb0b0f8 - -OutputLen = 20 -Secret = 6e68d5c4fb7cf6b06131330327a3827ee86cf546da2e7ed3 -Salt = e658429463b23ab2f18a4acf60cf224802f79603dbecc3822fb23ba873a2929d171e6a802af054495f153503c112deeaca1d0da36d3fc0d8734446f8 -Output = 5a81686a161159695b383ecc2f84aa54ec2c30c5 - -OutputLen = 20 -Secret = 91aa37a4cee4fcd78f88de45415316e6e0730ef593540724 -Salt = 9f5f0a5fb720fee5992acf0052ecdc53196e9a0fd5947d12fd05548014ec19b7958e6b026e74beb2a4d28bf9dc013c51d22e343428910a72adad7d69 -Output = 42f63b17954d94ef01bab430879b8a7b1ebfee65 - -OutputLen = 40 -Secret = d64c598436507f4d05d7ebe780092996f281901dc9c8612f -Salt = 0ea737cfca2560856917f3a2ff5e2175930d0719bba85a9c8d8cb311a0a1b8caf8ffe03e9a86ab17046670011c9fec5c5cd697d9cd931f615cdfe649 -Output = 3c26968bd3997c653f79bb725c36d784b590d18a64678cf312abe8a57b2891c27282e37b6a49cd73 - -OutputLen = 40 -Secret = 3ab05fc928fa3910c8df2be7b14be8f85a1e13eee776fd13 -Salt = 10c7af4d94385a366fa32f930d11724f03e3c320f76b3ed41e1d5b268cafe5dc03e1a0b15634f4da630b5eb5e89004fb34c460dec3a40109cf62d042 -Output = 39c4ad1bd064c00a5ed338c5fcef3655f9f736cb51125f656eab14db804f234d9809ba0d1bf41c0a - -OutputLen = 40 -Secret = 7f230dcb3acf7cac52bbbd82afb3490ae00bd5c698b1b03b -Salt = f7c9214774cdfb3f6fc40617cf8ec57ffed73e6f0f0a0387fa61937b55aa8cf4528e85bbd730a1c17bca874f5cb25666787fad986a2b3eb76e261180 -Output = d63a47aaff1e659c3319ab1ef66094728616d6a39482093ad826ae43ea2243a4c9e2ca088a2cd777 - -OutputLen = 40 -Secret = 88c360c3f3cd510c7304056fdc08b87ff0140593dd255741 -Salt = 9f17501fc275baaf1d583ad34b96846454f497f37a96cac2bd11a286c014ff6b6fd93a120dfee603b8ab4c17827087e6cd73e27d1eae6f182df9b65f -Output = 95b3a9fb86b4b2254deb45dbc63851adb639d40e10d6db5e5bc872fac8b68a0dfb379607685afe39 - -OutputLen = 40 -Secret = 09c48f87944b938a1bcdde8035d773b116b7a0b719361076 -Salt = 96449052c68b0b7ea704363154b5214df43b82239d662b00dd026786501c0e4e24ccb3cf9afb13514493cbd600d5a1b7d9148d95c234d1ad3fcb78ee -Output = 32a44143a1edaee9284617dce765037eaa767bb43810421ca10d32db146a009c823f76da11384c58 - -OutputLen = 40 -Secret = 4b0a49a5ad5a98d2c06667eda5b8865b6a2c0b50513951f1 -Salt = 295c39fb720ca9de04122929cd35887a833fef6030fe36d9d86eb85e9b0f9e1aff127f479ff79a02c0f5e75a5c11cdc3a208806db1b2a02b8cc30feb -Output = 3c9e6d0c3bf98f0246f6fa0099ec81a6688dcac7bf2f41dfe2924a9f7db05bf4c4c6b49a48fe78bc - -OutputLen = 40 -Secret = 3e935d2b930b7c5d139a838a8cea051eaf460ceb35eae816 -Salt = 4addb5867a474aa2fb8b20d14349e6e9830fd0d9de2fa3a998b6d751fbd9074d4c60e68bd11c9a827a7b22d3b4577f8ab4a89f38048efa884ea57e8f -Output = 02a076e347b7fddf0886a0cd44da100ac0875bbfb7a9cfc736df5ef4ad9630c8a9295bfdc3e2c76c - -OutputLen = 40 -Secret = 613128dc26d24f59094d1d6568ec5327cb1f8b99b8099143 -Salt = 7acb5708af6a10d904fde27c9e4d1c665d73e807a5167e2a4f475e57469b3232f3af6aaaa019c80309fbc1c32e0a5d6e3b8752d4924aa289dfded166 -Output = 704d67b46bb1acd4a51fc9f57e9ba8286444009762e1689dba7fd6f1b5d161aad16538ec76c1922d - -OutputLen = 40 -Secret = 660b529bdfb85d1206e4351409b3e6e3fc79643e40d1422c -Salt = 9b86869f7a52b94e3f22d92291bef37d6aa4bc2948437a77d0c412bfbb2c20aac4873ecb1ac2d7a8101e0955f97e916f36803da69972710a2e66669b -Output = 4b781e14cb39c151f746b1f2e7bc516d7c8114b754d7fbd80d6b6bc371486bf354fb8292386d22ad - -OutputLen = 40 -Secret = 4c51bea8975be9e5a0e429a7fac40b663f3299157d1f5d67 -Salt = f86e42c66d49a8beda818e54d7c5a81d00d02fc89d2a54e80f19a8034ad5e70bb73d0327545aa5d5387dff0a603e160933f8948297714d112358558f -Output = 03ae7ba3d2050b1865fc4a77918ad4903ad5baf26c0229a4dae4cc3ba62232547dcfbe65c1a21e89 +OutputLen = 2 +Salt = 1A299B4BE6E6B8725B78 +Secret = 488033B974A4F10C7086F0108C1947B3965DF1CF83EFA8C4 +Label = EC998576A950FDE75C12E688 +Output = F45E + +OutputLen = 2 +Salt = DCA1F183283158F8D7AF +Secret = 09C7B766B2F3B70922B50A549464E180D1907BD425050186 +Label = 4D1690A853F3B673BC48AE28 +Output = 43E6 + +OutputLen = 2 +Salt = B70EDFEDE2BF4A8179C9 +Secret = 1F36134163562A05A0065FBB561E59160295202436D49F80 +Label = 1AAD3EAA1332C8295D0E9BCE +Output = BDC3 + +OutputLen = 4 +Salt = ACC9806788973B96A6B6457A58315BE4B56D8B97 +Secret = 61DBF9BE7C2389BDE2432B4AF9657819A505A300309EA5D3 +Label = 6B4226D47612AB151EE48868 +Output = 123BAFD7 + +OutputLen = 4 +Salt = C0D27440B2C996C2EC002BA44394F1DA495EEEE6 +Secret = FA5CF1A840AF6597AACB55B35B7B2BB0A5E8D657C9CE728B +Label = CFBDF27C8910AA3FDD50471A +Output = 05317DC3 + +OutputLen = 4 +Salt = E7B8E6D818DF2FBB8AF2EBD4316D0B6EBCD9B677 +Secret = 26D04C8BB37811951CFA3F56EC25B7A880362D502611C9D5 +Label = 6B264872CEBD5658DAAB4878 +Output = 50DD3641 + +OutputLen = 6 +Salt = 6B9E8FE257645F3A8E3C088AD51F29640AC307155F531FFE93E27EBED480 +Secret = 78D6FE81584B58E51649E02E9C2EF40B0E0BE6CED2EB320C +Label = 1E16D2305F816244385293D9 +Output = 6451B55E9901 + +OutputLen = 6 +Salt = 17247E347B20FF8E8289404664E98D81DF40B5DED5ED40B2EAA871CB5F29 +Secret = AE67393C661D67AB2B69AFB3EFA6BCA49F6858DE1B174247 +Label = 0A1653B22F34DC8645DE1B78 +Output = CE8D581AD36B + +OutputLen = 6 +Salt = BCC4D0B140EED88A600B3CDD44DD62D1167971DBE9FAD261C01B7E32A8F4 +Secret = 357492F4EB88F9793EA152F3B680BFD4C77BD70E4E68328B +Label = B6E176A6EE7DE9396646498B +Output = 956DDA5C2BC1 + +OutputLen = 8 +Salt = 0928F9AC6112ED094DB75F319BCA52FFBB8C84CAEC3A8B2725F335D292F11443C8687F9D1865B8AA +Secret = B3FCAFCD9D40D819B9544051540F0D6AA36AD4F62AF1F5A6 +Label = 0F337947AB351578ACB9CB81 +Output = 53F03C01C6F4A494 + +OutputLen = 8 +Salt = B1AE0E16A9C1368A354190B46249F798E12177AF0D02077F204C354AD1B24E9444AF1F18ABA5B139 +Secret = ACB1A14D5A88578EEC37AC695A24D02473359346797BDDDA +Label = C1C8459CF92AAC10CC3718D1 +Output = A4E1AECA623D2063 + +OutputLen = 8 +Salt = 5B22D12DA79E9DCAFDC87503BBB4D29B11C844643963EA015C0759BF9AD816B72DF03609221AF92A +Secret = 0D8C60DC37EF425061754565C0AD6576EC9DE83DAB76A85B +Label = 66050F78A2E85A33AB3D3AF9 +Output = E3048A5B78A6170C + +OutputLen = 10 +Salt = 6667DD52C470D0CC4E20879FBFA5DB0B4A883C19C31B9E99A664E29C622D934CDB4E36667CAB0136E1E9A43D226A201C284D +Secret = F4C321962D6FA2E1F0216EE0B3D0692E8B844D79CB786E25 +Label = B76244F7BA63146DA32CC2AD +Output = FB6350F2C40FC4D41E6F + +OutputLen = 10 +Salt = B2C456919353FC6F135162706AE509A6276F52DFE9F30E970F6CD71C5909BEAD67FAAB61D5A767366E687B564A8ED13CF87E +Secret = 9BA384A4F09BEF04E6332F1CB082DB05C8CF1F9333DD32B1 +Label = BB878ABE3F16F49B777B7D09 +Output = 2F9DEC27EABC832B89AF + +OutputLen = 10 +Salt = BCFD044D6EAEFDC4F6985394EC0806FC37CC37D0005EA29222A0BBD91FC0228E5EC1AA5C0E7303F53D9A6A3B37B3D60ABF38 +Secret = FEDCCBCFFE737569776E28A87F665046FAE9A52B31ECB5D5 +Label = CBC68CFEDEC4E42E80C5B549 +Output = 999A8EDB603137C9FB65 + +OutputLen = 12 +Salt = B17E58F275D96E43EBBAFAEBB07333BB4687AA2DD379DC6582E590CE678694E56C1928B080D6E2DEC955906D52B2749C29D093DF7E798A4EC6317205 +Secret = 52E5FCEE743C96F6E858DF91C9764C14EB0C7AECA211CAF9 +Label = DB94F769539E31E9DD1D7081 +Output = AB0EC0049E1F4267F2A49BDB + +OutputLen = 12 +Salt = 90647F2D22D3D1C9CCBA1F95172844E8181D7EA673A3C65C23357EDB84A8B36906E41D6094BF2F855DD2EEBC5A92925539D67479B57F2DEEE0E86548 +Secret = 785A792AF368107B9858FFAFD67774A76E6B3C181902E230 +Label = 6B267D6D67B12A5BCA4B2412 +Output = A9A82D2AF66B25C8F385EA02 + +OutputLen = 12 +Salt = B117DCF22E14A213C5E275D0E2A0A4C3DEE039C48ADAF0A79E6254E38B6B5C1F68E46E5AF67955E4E3C325963C4C9549B21E235E6A0A1B3D3E66C2BE +Secret = C9B0FC6DCB18674695B57E88F1FB4A9029359705FAA36FAC +Label = 180EF5FFBE49F3F24483E00B +Output = 007876CDB3BAC1F09035C982 + +OutputLen = 14 +Salt = 4BA62B15796C06A58E7614EFA9B6DCB88DD4CBE4FFCF22D6C14A1ACC3E07E35F4F019DC129E4B1E9E8F10DD19951D0E583062F32A7B599667EED5AE950E3942C065555BE7717 +Secret = 9049E0BBA40CFB0D848FE818A056C5C48BFF7D468015905E +Label = 8DFC171E24A176E00EF6C257 +Output = A24717F17D2A35CA46D58FB4298B + +OutputLen = 14 +Salt = F8992452E3A77A38A8D7648727FFA3724B73CFA16DCBDF0C3792AEDEE0F42B7A2474FD02C2103F3F2FCFD89A9B51C1C8D2BE6B0EED7CF3278464D8F22E838F638DEC18C1208E +Secret = 8F0E9D846B732C918B475B3B4BF73C96234B746450BA888C +Label = 3A4A99AC130406AD0CA169EE +Output = 1B2F40CF47DB0C62D223E6CF0698 + +OutputLen = 14 +Salt = 30D741E9B4889FE24BFEECF34447C577F13DEB3F7B006BD6E80213B6F0452CF512E406FC3FE006CF1AFC0EC114D9476A7167053C764A63E6D70970371D75500D28CC40D1500E +Secret = 281B596E22C3AA6E2D80EBB89AFFB1B7BC8A847A2939477F +Label = A5CC3F388B55475E36908C52 +Output = 7E55ECF9C8B63BC7C6BEB2639122 + +OutputLen = 16 +Salt = E9707A6DE0871C72E8E18BF50F8EA2CD1CD3F371FBAB0E3A465D9B1BBC1335D6AF81575B1F69E18ACC1279368FF5703BA889044F145A4059D64024199D911C8A19C73183E8122A372E485D1A611699C8 +Secret = E0FDC1B56E8D7930E9211F0BD9EDF11B1F2578932EC70C7D +Label = 5B38B20625EBB12292710D09 +Output = 586E59D4AA8D4867F6D1913BF03780F4 + +OutputLen = 16 +Salt = 64D7CE1A28BB0F8C0712A0197CEA3E0F0E2473B23DA3D2769CE9BA0B435EC7290BC4FF18EEC7AA5B42361208C0B083BA3E8FBEEC0360B0D327DFDE899A84466461F59320A089B40D055120A3C495BC6A +Secret = 432E966EF2DE7F5B1AA71B739C1F6886FD067776E2484CF5 +Label = E882B3524F3CC9F195494952 +Output = 0CCA19C497F6D5E27CB7B82FA1325DF3 + +OutputLen = 16 +Salt = FF13DB88471D792F8DC4D85EB17CD1F29548B06867CE5A19C1D4CC4AD612BFA5B242ACF458897364B8C35FC2DEEE0C3EB762044AE169A6309DA90EE2C8775C6029A9EF9E42EAB98B83D5C24F3E625F36 +Secret = 8A6DCA021A947B4960D81F3BD025633A78846F138CB2002A +Label = D130184E31EE503E36C68F45 +Output = B574687483152B0BB8E8CCEF205204D0 + +OutputLen = 18 +Salt = 0C38F69D7854ACF39D431AA701F5922FAE98BB11C4197B234FF41C487879914F0C9BDBCE84C7D1E3F608E0CA307279F2D29CF40A40D16B11DCDBF3B9D3E42C38C751E4A1277A522FCB4213DF73852BFBB1F5C82BD9052480619F +Secret = 1C6DE2A295F4BD1CBC6A2C99AE366B0EBE36E5C4E060416F +Label = 18394AF9F64099D33E8259B2 +Output = 849E1A03FF197F4FFAC9D11A532C239257C7 + +OutputLen = 18 +Salt = 5B49C7C10F70C2A5D8519F660FB61F0298E3C648AD1F7DCA7C125629071202853A32DED2FD4913F1AD745D5AF3D0779B1B2C32250628F41005DC182DD8AAAC75ED9B38C8E9BC77FAD9D84213C9A6AFCC41C7435994D4D6366100 +Secret = 8204AECA41F06E24C1A9A473B84F1E8EC861DACDD1FF9FD2 +Label = 2D4679B29A352226C9283F54 +Output = D741A8D7FD774B3BE52031DCFE4F66655DA1 + +OutputLen = 18 +Salt = 7468FB5DDCE37F57EF632E22A71F694048D97BBA033B8BFE725ACA2583ED107DB17256E9BD4B24791A7F9B3AD2AFD75498106CA93559D2A578128E761559BDC23F55BA8EEA75848F673A9E559A1D0F53A5102653EC6AC4B31C85 +Secret = DE8A84E3B815F0C3421ACACE92EF9676B966607F595D88ED +Label = 8B480800F1E3D91748A16F67 +Output = A28B6400B0AB2980893E16932B3667A8203E + +OutputLen = 20 +Salt = D541AA764F6DAC29100E54031788BB5C0F26D4629F44145D9D498831584C92FE74852F35CD67B5BE21F279F7C8FC3C187BE6F296B856B16DD001CBD520555E6E3B5371466DE0578046B9A7550E024871656D4D658452D4A0885479F96B79CEBCC6E34931 +Secret = CE2F64D4061A3D3310365A1C52E8805DB333D64F768D6B1C +Label = 9754B8D8EF591DF604F1928A +Output = 681A55C432FF0E26CFEADD88CE50A3941ABE8EE2 + +OutputLen = 20 +Salt = DAD803BC3BC2C8E22728A8E59335A76E14108BFB9A4DB7EB2520FDF5AFE7B949513050912ECA1091DF66F22ED88BBC2373698DEEBC2EC510969DD7F747FC4B3E55BF42F36ECC482A24AE9907B8E3E5943DE7C03FD44F8CD36B15CAF7EDD9137B12E3ACA3 +Secret = B5C148D17EA7963C820444D6171E82D41674018E19345E14 +Label = D3F738655651B4791885772E +Output = B64950C775C11EE104947BE6F0B27E119ED7EF99 + +OutputLen = 20 +Salt = B7B9CA2ED4C123188C3C668207E57E50A9E170922AEBB5F8E96C3377F8F674C15A85E143753605AE0969C41EF8827477C9B939F3D0D1BB31A19900E0DB4F611B9AF2C0D9F721F1ECDEF46CBC7D558751BA7F23625AC920F1859EA19289210DF5DA206680 +Secret = 6AF6B6BDB585CBE679BF1A85DA15D4E78F094D289B7FA9E4 +Label = D4D4DE7F3FEC705E5FB3AFEA +Output = 52B5EEEDB3FEADEB7A87C274D2D6D978784C081B [SP800-108-Counter(CMAC(AES-256))] -OutputLen = 16 -Secret = d0b1b3b70b2393c48ca05159e7e28cbeadea93f28a7cdae964e5136070c45d5c -Salt = dd2f151a3f173492a6fbbb602189d51ddf8ef79fc8e96b8fcbe6dabe73a35b48104f9dff2d63d48786d2b3af177091d646a9efae005bdfacb61a1214 -Output = 8c449fb474d1c1d4d2a33827103b656a - -OutputLen = 16 -Secret = ec9bf202ca734acacb4c880ab3fab2a11a27ec877c66842f16f7cf5e611b55d8 -Salt = 29bba1516d9d58ca3b88c9e01f88e02aa04fa62f6e0314393e89e41dc8a85c91faf8d4344f550d4be9c7ca7ac736e908a257ecc77352cf8726314322 -Output = 1aa9c924cd2eba50e5b5aad7fb27a0f8 - -OutputLen = 16 -Secret = c27c7fa61435660873342571fff48be78c5e0c059c34c10d51352fb8dbd83078 -Salt = 75c8ab290ea5507bf5ca75dd098e0b9d156aa1efbdf964d3bcf9fe09946318f9103d93197e3d6879fc2848c3f262509b9d0ae97bcbfd8420788b5e1a -Output = 06cef2b5fc4507e836b8a0e73b89f0bd - -OutputLen = 16 -Secret = 581f402235774ead143faa69a816dc6e6d436245610fdf4498bbf6db5144407e -Salt = 549dda4dca35761202164bc18857e4d8e493547c8c1d30b62f92a849f5fa93b8e4f61af584623e4a2e313575129bfe3b6072e2fa5b68d02533c67532 -Output = 5b1b4a1056345f7dc42ab43018b9a487 - -OutputLen = 16 -Secret = c78b40c86a657009e11484c6d3ffdcecf1da3ab96838198c774b3e311b44dceb -Salt = 44a7b4390c0aff9674be6d3fc372e415faf5ab34b6a262cf066f1bdfe204986a24185252fb60c56fe204a5af76b5b41a77e280000d3d0b1d448f648b -Output = 26bcf41fef27902f800f6fa99c3c89cc - -OutputLen = 16 -Secret = 9c001f9819980cb68f48280c12819c9feb5f8713e8acbe51776a50c025538c59 -Salt = ff311ad2e2db6e2e7a93f8f5122e3573cc2c3c948e70827ec051f3d359f6e1fbd71aae27144cea5662014d353ce33d56e5757d628cb7864fa3d9ca1f -Output = 32e41464d69e8081bd30bce4612911af - -OutputLen = 16 -Secret = 4111952a4e917d8846f7dd7621aec6f70e4690e7f4fa36718f3c3c947103005d -Salt = 7978b93b2b05ffb65d1213f268d5a1d7494392d86647bdd2865e6e14fbad49b4f8150eb0575dbb37a6334e2f193afa866117ba5cacddb42220c88897 -Output = 4fb9f87e82ee3f288c3061e2d420acbe - -OutputLen = 16 -Secret = 5567d5d1f74ba234d36b1c105c387dee55eff876979e037dffeda8219fb4f28f -Salt = f26e591668e012646602492199eef2963bab6c09993f0dd64f4c696bc601d607c4a4434705fa617ce64d07f1e1c34ea644bfc742690cbf25be9fa870 -Output = 01b189da9047027ece68983ceefefe1a - -OutputLen = 16 -Secret = 523fd5e17816fe4a560b06229d8f1698eef560e18e9880aa76faece373939ce4 -Salt = 947e2d56d0975c8189e720710ae275364f5287eb41b893d2195ee3e4d961a3a2832031fe50a757e01edaff322f4909326edc5992dcabf00fa1817703 -Output = fbd10634c6b24a9754e9abb87b18add4 - -OutputLen = 16 -Secret = 2be344ba231a8da6d3b72601c6c1e930653445e5f2d34e39d9068b9c94ef7d4a -Salt = ac7f3833ec9c73fce5dc57c5b940ab8c3e5f549200c2946c1067593613115fb26727266b3a512256c237d70544c4be85840f07984bb19deb78c9c8ba -Output = 6276fccea4da3bbcf635a98e127ae603 - -OutputLen = 32 -Secret = d54b6fd94f7cf98fd955517f937e9927f9536caebe148fba1818c1ba46bba3a4 -Salt = 94c4a0c69526196c1377cebf0a2ae0fb4b57797c61bea8eeb0518ca08652d14a5e1bd1b116b1794ac8a476acbdbbcd4f6142d7b8515bad09ec72f7af -Output = 2e1efed4aef3fdd324e098c0a07c0d97f8fd2c748a996ce29861ca042474daea - -OutputLen = 32 -Secret = 8c9f3ccad22991e925c33627d430792bef8f8d9c7b194f1c0df5912435dbcfd3 -Salt = 60e0794af22b404f6dbf8c5cbdf916321b75cc13861be5c3524021466f5ceaf9a4c2683cf8182eede390bde51c83ce72f4b61f3803803db9e52f8023 -Output = 8bb189e1fd082f8b29e1f8c0118442524c2d0a2e471757dfa99453818c0aaea9 - -OutputLen = 32 -Secret = 06efa15de9c4e827b7bb7f84355b643ef71c97790fc351c3f681bb1cec4f5fd4 -Salt = 5b0fddc9d05ddcb1ec22719a1ef7aeb497fa15779567de0998a2fd434333a931f137bc9463d608bfc3f32eb6f6ee2be8e47771baef96986edc7d30f7 -Output = 3c296c96404de961b47cc6ae4f4d52cba879212f3a63a87cc53480770f215627 - -OutputLen = 32 -Secret = ddb0d33e3e978357dfef49349911abb34a8c42421969f1d04ce7e9fb84b2e0f1 -Salt = 298e42650f4ddf30a1fa5dfeacabce3a2e74e50615636d5f64660dc01327d986f90b2ef79df7e4fd29c4f3289f22e4215e18f74c3863daecf08f3c9c -Output = d052d7e7cc62967101653203e41c2ba3ec7b5fe2cef4595ba5c40b7e7b179505 - -OutputLen = 32 -Secret = 73dd669f13412b0b456ed2bdc0ebd18fadc05edeb5a9a6858064461e7118e881 -Salt = 2b1988fbeb23da73057df855573c60454bd018d2529d0b159e3b80c7a7aebffb477d66bc5a92824de9946a0fadc2ec34c2cf2e8a1191d2a4b172c559 -Output = 898dfe8f3480854cad0fd1bc88c36349069f3332cf90f6166bb1d5a6d962c7a5 - -OutputLen = 32 -Secret = 69dc59e4baf77c5cb1d37da7d723cc439a71462564b812cc765a464bb52dac86 -Salt = 5cb38a0abf44fb8b044cd0b3c9638a35879ce8cc5cbbbff3b01513a8be59664db068b4d89ad5984c2fd6e9e1dc4c02dda0579e9e61890c2044e19704 -Output = 720e993c06b6b05ae0c0880e2398c08e34a3048de6325321f4b5fdafc5269be1 - -OutputLen = 32 -Secret = 9c7005867be9b829d38af981bad1bc95bfa3dd3a443b65a6ef54a9b1f8ecad7d -Salt = ca2773715d037eec7e5e1a437d1db0ce4d52e617c68805ce3771df2f517b394942542155734330e1a05e47cfe1373faa84d47474109b20e423236a7f -Output = aa05f7a674fa0c2acf7a2e94ffe1c32aae6bcd510e3bb1e223a63ded932c8e5b - -OutputLen = 32 -Secret = 22d9bf5668bd90e8d8fc43c3a04356e530f9f793e3a0b3bcd675403335bbf559 -Salt = b8d467bc14dc7d4f24bd58872cf77064e787e085a9274ed071f66c5516a2e4e32f1eb423217e30542d74a77c0b74fde49321a06878d2e0f1954d61fa -Output = 20dcf4ea36f990a7ba3a1845c46e2c5c290aba39b32d984271bef02bf05a004b - -OutputLen = 32 -Secret = ea85fea6137d953cd9d5fa0f55f64f247d6e652105666e2193877029d2864493 -Salt = d64e9a7cf0b0f1089944378b51690e9e22e08e032e872b53cb35505158e4c374141a6456a910a7964848f98aa861e4fd12dfe4e09cd647a6d1efda20 -Output = b7a47c0333a1f7742fdacdb30b1374b3c7a054c431ed14622c01957e41aa8a68 - -OutputLen = 32 -Secret = 1621d11427dde824f4b5ea6d5d7d6aefacd2f568aa4443ff5ef58653e74400c8 -Salt = 6f5445344fef88e4af10bd0e0f0ec667d81f40ad308d1fa448fcb9aa7e105ff6e89624e5bd90fd0b7770ad224e0fbc594d32a006d4f0c87bc3a03d6b -Output = ea21158e118edb1fe22f79ed430bd16982077e5f91ea5ef4d6690d933b366006 - -OutputLen = 20 -Secret = 99f212241a343c1c8c2104ca6d28062413d985c21e6bba27fde0c622e2e4e6b7 -Salt = af8dc1cb7d1f82ca834628c20f0fc81920eb3ff3f75d3f4e3000593e9c15872479711d99d1b7be794f58d80a31bb112219dc16e6354111ab1161e21d -Output = 7f778c625bf0d083169a51584f6683f24af7c35e - -OutputLen = 20 -Secret = feb7d866b6303e7beeec7df2a1e3e693627c0616fbfde1f9ed67ce9b5b2687ea -Salt = 5961ce06b7dab908222e9d95cc04b554db1c209cf0b00311f2eb4fc2cf36c9449943371dccdcc3337e5ed7c2546ac6eacb9bd5b52ac8a1d264dedd24 -Output = e097dba8a8abacc2cb6f0753acc24990599e1607 - -OutputLen = 20 -Secret = e95dfa799112b43bb1e28fbaacbcf8f0a879be0583caf13c0b47948c6ad6be33 -Salt = 9961d38bc954af7a2c89d0039e39dc969318a307c340ff520b4e5cfa86e3c4e0dddd4d58f2bb81b058bd9a0b5996de15540f2dd72c01dc28499d35c2 -Output = ccdaa0390d3282882af4da09170d073c164f8f4f - -OutputLen = 20 -Secret = e79face72d71d5be4f55d13cc2ee18f02d903c88070bc3fa332c4d4c4a699ac6 -Salt = 7528d1b398b1e50bb32bf673994180a511e39a3c3a88e27100cb0eb8525f65f9709f7c79f4851465f5d0176a56b7179aea8b7adbaa8c2514c6c8bcd1 -Output = 0ad620323c7b11cdce0b775710d09e04e6297859 - -OutputLen = 20 -Secret = adb506e86f2ab9d8475401093ffc06c6b650e68f16a7295c51c32b9d021d95b5 -Salt = 180b5989be71db7a90f3aeb779c6ee122390d45f092a6b7f71cfa16641a752b9dabeec1ebb0c2eb6522527da66e5a81d9d9850eea2340de0c492513d -Output = 372b38871856b73dda5a51c16f77afede05e5ba8 - -OutputLen = 20 -Secret = 6bced8246d1e9ae8450f6341323ddfbd3fb35f8e9230d5d227e3b89ad3bc7749 -Salt = 484443cabbf94cd219e0bf070310745f5236471364ee677bbac59f52ff2e1745e8ac645aaa56cd351b247c0d8c3541993d681ccd70d562d4f23a2d90 -Output = 635a8c2055f90e9c6fb75a430e2317e088af6d68 - -OutputLen = 20 -Secret = 5a9ebf2ca85afd6d2a9e6d451b5462026df5f8814c2395e4f44b1a2a8f71e79c -Salt = 0537968ba7f32f346da0865aadd1e994c17e606352df4a0c3c05962c52e6c939359463188dc576fac6432c1c54d80354d9bdbea2574f8c4af7df699c -Output = 096ff72579a43b817f9ed71cf3c756547c9100c9 - -OutputLen = 20 -Secret = f1c806dfa2834658be83cee38f2919ab2234a43922e672cf660f5e9309e9891d -Salt = 4649b1091e4f843f3f6fac1c3c9ef5f5f0c930e8e51ca9252e2063fd9761aa3efde664a3fa9296bc9a433e7cfced6cca924ce50d9965964c5209be3e -Output = 767d9260039ec7209c6a1757361016b7580bc5a6 - -OutputLen = 20 -Secret = f5181e0a600a0e432834603976c14021f58fdcd242b8c1957705460ee354e806 -Salt = ccc9260b0326dd36faa42930f30776b021e83d995cb94ab7cb3a30298de460f3f9b706440d1b24aa75c6eb5e054bd441b1d59348c27b30165576a06f -Output = e9d77f855d620dbf30321306874e83bd534f6596 - -OutputLen = 20 -Secret = 8f1220a302bee2de1873eeb3a0eed46c78b4f93490cac88ab8a2a02627eb83d0 -Salt = 3241059f81de12922623af054104e0189f3c3441737420f5e9e6df6aedd730786bbe4563b38f4f435e7d1bd381c15fbb35be00b955b3562731881353 -Output = 99e8122d12c216a4d907dbc41449fface166534d - -OutputLen = 40 -Secret = dabde95d751ff1c132bd49f80f4ee347bf39218cf8bfec61bc3ad865d9aa1182 -Salt = 55da554307ed756764d4e97febb77ce85391b53225ee09417ad57def48ead090e3d1e7c2ed04f02462a6324ea0163b18f86201c69db27fd50b4c42c5 -Output = 5cc29221cfa6f3a4ded7afeef5a59c05bac787fc5e98a35ee0c96ba582b05c42f758966566084f69 - -OutputLen = 40 -Secret = 201f78b11f94b5c1d6f5d46e4c4bb2971a12737b9e15ba11bb367be5118b461e -Salt = 586193bbec1fec6057d03a3c8eed20ec5a2530caddbf7c083659fe2ca934ad0eb301cb31583327c1bd22222ecdb0daea618a21bcd03c8bde610bf6e5 -Output = 9d1974dd6deb299d61d2fc69a0329ae1909ad2ab53073c85716eaf2f405abce27765c969978967d3 - -OutputLen = 40 -Secret = 2dc48b8670e3274858cbf226e4229891d71d6a575a9001d7f92adba92501ac45 -Salt = db562f3d1d81c85c4a5a30e8147eedb08bb454e28fc449255ce7b22f282a9bae0a720d9488e627172f75558ea1b91b72fb5055468a7afc85431970e8 -Output = 718b2dceab0c1948a6b93b3dd85170016b45356368687786d04083c6b272ed863f42fc771ad53091 - -OutputLen = 40 -Secret = e52969a62e618b5251f2c3bade59fe8f3fd3b3aace833c4c3cf3e7df28e8311a -Salt = f7db65ff442a87d4374714862e8fd1464ec92c4fad8ad115fdd30ef2208c7388a92361aef6671113a7802720d7c992f3377f192f93bde321184600db -Output = 2b9c828f2e3eb2a619ae320e5b19567c1479a6b9daa9a35f3894ec065474bd6c2e1c12c037dd4fbf - -OutputLen = 40 -Secret = 57b2fd6033dfb399c1f3cc177f580082fcdb3d72e3eeea484d1b52a2ac7fdf6e -Salt = 4b38c2a70643986cd5fedd0939e89bfb25aabbe8a552e480e015668a445419ff3745d152f12472bbb65fd0840c699ae585bdb8f6edc2e8dcaaf0fa5b -Output = e9952996b13f8e2b534e22a93635cabd19abf2ab7ff1c106c111c3cf609a3a92007d0df480de221e - -OutputLen = 40 -Secret = 9f74dcc44cff4bdb0d45bf487063613d5d1d8a298b6ec856709bd5d7b335c27d -Salt = fe19857b0bae929e40ad53049f7c3a1e544e492ad2ddee372daa9e90a50d706088c18abca2429a809c9d7f46a5a1db738c466014b4727ca7afe2da1e -Output = dbefa67eabcaec5870cfce311944cac936914708b95c10ec137ddc4ed8b9cae4304edfac35aaa536 - -OutputLen = 40 -Secret = bbedfa89d99b1b61049693131a423a295c122ff8e8680241ffc3e3b7acb6f941 -Salt = e4ef3bf76cbe60c70ed47d09c81f53955a5667c66a8bed3b0d390e37b91d9d5449eba63fca585ee69f49f012db0f12e077cb31a8368f594c46516725 -Output = 8878ac29ac55ef0e0fe5037f9ce8d90f05a3aaed97bfb9fcab1ed31f28e46170329f04851f667ae8 - -OutputLen = 40 -Secret = a3083703d5626314088a877f6a86d97caa86970b89d4d03919896225ded315df -Salt = b8e6239aba0cdc9cb5e0de0a8f511df640c15ab8d9a022f0f49859ad171cf4da6b2dcdf5cfcab1142c406e137d07da38f6b3b3b6413e0835c61bf0b0 -Output = bf991833a3498cdfc194cf50cd7a1f7bc12b4ebb2aad592a396f56e25fcd7d3185581a3e89374745 - -OutputLen = 40 -Secret = 0811263f8c5f800b19c24a060e6d4c46243f44fd9774be6f3d49a198fd05bc44 -Salt = e92d1f334998bdcd04de5797cc62ee4747a1709ff0e74bcdefc7179dd5e909b2535d7556bf2a065ce115fe3041669ce303f5345205db02083d57fcfb -Output = 9db692422a8ac0c5364e3a980cd2306b76466fe2bad3bb9307ff19562548757b95a540b9cfe72e7f - -OutputLen = 40 -Secret = 3a6576a1541e07eabd47c3534a4346ab39f15eb01d83ecf2319081f6e7ada7e9 -Salt = a259cae2c4a36b89563cb148c78251343bbfabdc13ca7ac2171c2eb6021f4477fea33b28724da721ee087bffd794a1563754b425a8d09b3e0da5ffed -Output = 99b787ef90a133e5736fdcf175c3a380501f45dec8f093ecdd4000652f4ff1c6575248a363d45d18 +OutputLen = 2 +Salt = CD361E17C2203004F8AC +Secret = 4740FDE87398C154AB3079E54079566C75A061642E28DEB4338C597FF6060523 +Label = 6E742D48D679B9514164AAE7 +Output = 788F + +OutputLen = 2 +Salt = C02683DC630C7312644D +Secret = 2DA1CAFBCFB65CB30E44A401002E2BBA4BF9547A96D108C46AB0FCDAAA7FA435 +Label = C9A90CDDD6764C8E5A6BB700 +Output = 0D0A + +OutputLen = 2 +Salt = 64B4D0B9E9B12D463DEF +Secret = D35C2740C6FEACD810D44B4B904EF3799857920C043187B57D1BBB6D9BAC8CF4 +Label = 716C62B870ED5A342EDA1172 +Output = 8EB1 + +OutputLen = 4 +Salt = FE538B3969701F9A82251903D6D21D1F085350D2 +Secret = 3A78CF4E1D3029D92884F69B505A23CAA00C37B7D9D1F76462848BFF37872EE1 +Label = F59167C99F11BF6DFE93BBF7 +Output = 95763E00 + +OutputLen = 4 +Salt = 0546B86809DD394A1A06867921D418C0376904A2 +Secret = 3BC6C318C5E79C9683D3985CBBC726BE42B6103F2FEB93FFD19595362988459E +Label = 1E8D590874112F882543EABA +Output = 0CC99F64 + +OutputLen = 4 +Salt = 68C20175832F15C8CB127D859BC910DA10558070 +Secret = 76B1BC2D6C1C919BE481CA1F3756FBABDC430AD474ECD5619553583C166EE327 +Label = 642F2DB727EFD5561F4A2C04 +Output = DF0CE732 + +OutputLen = 6 +Salt = 51DE4EB3E983FEABADD996FA7E3DA97C324AE23B26B4971E209C0C145390 +Secret = 894E55234DE2B5C20798A1F9B437ABCB3F5AFADD0A6DAB41D632FB46C2A181FC +Label = 63986E0E8D1671A18D149652 +Output = B6698AB69E00 + +OutputLen = 6 +Salt = 8CB52C4464FC55F3C8FA087C0456F0F464D0D74866DED304266AF66648A8 +Secret = 69120F31DE472DFB8B1E616C73F79524EC34122729E8C52609C1A45AD4825317 +Label = 7B4BA0D8AD4C77255B082646 +Output = 9BDBB763A0DE + +OutputLen = 6 +Salt = 841EAA0FC7E7BCAA2FA4F193BBAE458E6C430BD3D79449BA2015E8BD3AFB +Secret = 3DD4FF8B2A8D67020DC1F0A48929351CDCCD44AA4643E86350ABF942B2698EDE +Label = 2AE9ACCB8387DDFC35A2D0D2 +Output = B5FE14ADC109 + +OutputLen = 8 +Salt = 6B9AB8A84196D5AF3511FC7ABB80A1D8A847FEDDC3426322A7538E109F18B074DA83119FA1F3EDFC +Secret = 102C69C4C5D82C68DC37143F821759C2A1D87F3AB2FF6498DE0E98D7AC107C2D +Label = A557CFB1273BCB7B1C6480DE +Output = 57D165900D1F0E9B + +OutputLen = 8 +Salt = A32DC4F73CAFC8B6EB4DC6041E028E7D03883FCA1BB9CBD0C2E556195CB7CC208F039147179AD0C4 +Secret = B8A712277B1BD53CC45F284232141B74A09D7690A50C9AD3A15AA4E67268943D +Label = EA8246233876E6D69A2C025F +Output = 63B001FDBD3CB92B + +OutputLen = 8 +Salt = 6F96F4B26F98845029F6D8D0439036274F0C5921E45ED4FCAEAED4BEBED116F993F0BD5C2004DB16 +Secret = C6E4C09F7DB4BC916820C13F496865BD2D8C177512F51C2F04DE3A98C9D322B7 +Label = 9B366117578341D780A56341 +Output = 9D3F2A23D4BF8654 + +OutputLen = 10 +Salt = 2759DD8F986789338B6213AB5C4F750FEAEB6B135EE02122822F978AE3B2A9A2FE0344C944995DFF4DDF52BA157915D44F16 +Secret = 5FB19FFD6C044D1CE6C58CFF9B1C66AE03CC1F81A558D5955DE8AA1608D4C263 +Label = 62EA349F8D2A0125E2DCF1B1 +Output = E477C68DEAC259E8C5DB + +OutputLen = 10 +Salt = C341DB776F7B43C3C58D86C529B4035E2226A88D3494CD844F35F4D177487E6A92881E80620EA6CFD4424FF41B361FAAE63B +Secret = 7A48EAD098F8914CE444AF841F102FE5CEEB01AB64D82CCF3C5974DCF8069195 +Label = 8AA6662E05AD2DB22BE52BF1 +Output = 2F8723F02B5EDE9B829F + +OutputLen = 10 +Salt = B6F9480F8438945755FCBA50F9E82C40F62F0F89027C77673C098487161C777C31D2F424BC6E637A03C02135372E4236C086 +Secret = BBF24DA06F7DDBDC012C2E782984F3C06675EFBD97F1E9BAF515B7DD76BB221F +Label = E20513F3E25CDB5B7694696C +Output = 99147075B21B22E7C6BA + +OutputLen = 12 +Salt = D664B007B18F3895D7A9138D0A2926F1CD9F8391CC5EA5A0A97EEE79BDE79FF4256A08378EDADB9E9B51301CED3C5F67626BBF7C77855E8F1DFF6BE4 +Secret = E149D32640BC7BCED3A0B65E9DB85CF84B4AE7CAD63EC57868D9C3AC236B4256 +Label = 1779ECF0411CC9EFFA107E62 +Output = B1847A7E77732648737ADBDA + +OutputLen = 12 +Salt = 482C412A1533A09A374E2AA4CCA8D43A8BB2E6BF82C5F30C9ABE26D2A3DCE08DE009CEA12537547871990626DB46DB3721DCDC0305E498855CFF83C0 +Secret = E0E8C67A1BC1DC66A2220B5DE2C573B94FCB7B727BA76A92A312EECE255655DA +Label = 31BAA860AB6B60169C055793 +Output = 6E9A56ED5F903B6B160D3523 + +OutputLen = 12 +Salt = 98B5E0F2252D570D1BF6FBDA0737DF0D9C88ABA0B3041660BAD83A961B6575A7C4B5B6B43B9B2812D64A33E773690B88A222F79080B88FB4679BAFCF +Secret = 714A8F95A544C7C55DEA18A9CD69FCF57C34E3B2D6ABED602ADDEB8164737B08 +Label = 1777FE42037E57DD06F66B91 +Output = 9A0C348847159C9AC33FC5DF + +OutputLen = 14 +Salt = DC6100952E0FC328816F09BD3C67EE1B67C93B6C24899A4175F5EDCCEE2AD84966649D88CEC8D9C760E7712CD4ACC7E22773F70F27C9F605131005896C25D91E0C387A687FD2 +Secret = 4AADB64BB7689C32F8C5AF3A7454138AD0A6730A75A057580FE67BF1EE62F3EC +Label = C475ECC8FED0DF1F5DA2CCDA +Output = 84E18F2464C141846CFA12397803 + +OutputLen = 14 +Salt = 177DF1A46ACF8760D77F68152785A991931020F9C70C580442FCA33CBA452FA5F2D4A549BD74C52E12E4A7EF14F1C7C8EF1AA4BB692B7DC3F1E49A8E7CB022671F19F4BB821B +Secret = 2DF727295897EFF247A49D7E0F7F4BB43961E9E1ED01C129CD6C495B028959C5 +Label = DC82BAD469AF590E53680ED1 +Output = 545A74281D7442D59A1525141F79 + +OutputLen = 14 +Salt = 2B77C56A3605B047F4DA65133B252745340E1C8D2C1EE104700A2E10332BDE318578975FB66F61D3FF48BF8AE104ED49863BC5A05798058FD69A53579E94619B07E1057CF317 +Secret = EA52FBF1E93E12F77B8C4D983DC48DD33DDA86DA5BB4CBB7115E7C1808096EA4 +Label = 5608D5B363C74FEB95840E00 +Output = 64B2C38D70B1EC35DB475F9309DB + +OutputLen = 16 +Salt = 95A648CA6E1762F5DA4900677E6D21831B69830E7DA1055AB54B6765B7B88A7E1583CB4157753E5496314DAB068BDF46DF0643773FB7B056F985B15A18CC3986435F0C0051867666A8273B78CD26362B +Secret = 027D302CB281509C846532634DD9128B264D4E4D71AFB980D6B6AAB722C10950 +Label = 6D97B1C11422A3DD719607A7 +Output = 0524404AAC6D6E3FBCEE5891668578BC + +OutputLen = 16 +Salt = BB22312B761415CBA068469CD3393FE966A10C27593A01967119B3512F0FBC46A909E790C8EDDEED31087817B25C7144BA0BA9EDCA356D2D533ABAF3EF129FF81FE3C5972839CD42A01790547742DC3D +Secret = E9851CE9A6724AA8E8382FE7B94A311F1EE8363A5D9B719764A2AA6B18E5B194 +Label = 6F6B37541394AC44F9BE86BC +Output = 451E1DBDD87C33699AFF4410F32C1B86 + +OutputLen = 16 +Salt = 9D01B7B6E778C078129884D26084F65A5C2F8E304A6C08888F9F98BB40F02C0AF48D79C4963998AC7057E7FF680B302A15FBE8D0824DEB217B96CDDE0DF6D6D76BAE240CEE2CBC3A597CFD3D733DB381 +Secret = B054ABE49A5CE4F9D28C7CA0D89B21DC9F65879BDD2FB6D1A6BF4D80B10E19E2 +Label = 1374E15FCEA97A638BC94E1D +Output = 50966E293EEAEB6D13C6818D1AF8AD04 + +OutputLen = 18 +Salt = E5C89E7A2D86BBC56F83DA18F410E8957BF9BC67D76C9D59A03C976D8E42B0BDC48CA00B60D05D8C1A33DA43918F9A3AFCA29A8130CBFADB7D1A397881AAEBFAFCB8B263F9E5F22879A197CEABA312A02707159B942A79325878 +Secret = FFB57E751E464E6731028E7A2EE7CF165081CE2A730DC28D99D8F18321E995B8 +Label = 3862FF311B542526C4FD8BB1 +Output = 919896CC65F8E28738ECD84859B8E9D9EDC6 + +OutputLen = 18 +Salt = 44D33F95D84219651CA4F270E4DB8223C8F3E6541B6D8472DE9956CB1552083086983397412F1F7E733691EA5795ED130FD28AF603AF3783FABD2F6955DE5F44F3F6E49315F8F03994B991758F016093F6FC36F105C839CD4A6E +Secret = 81AC2C6E9750C0E7130B9F55A767E7FA6AC9CECF71659A9255FE2B3ECA3A2032 +Label = BEE557B8174AA830B5ABC9EB +Output = D2208A9055786E4A541CFCBD68248CD79E49 + +OutputLen = 18 +Salt = 00F49A14F08420CB2C2F312C33E4D633D1CE376191402F80635883955391E43A5886B69EB0E563B6C9A7E9E603A5BB8971572D4F0A89B45BF18137921D2C8EDE2D0C65C86761F6FF03FCB910DF1EA55DEE63D7058392FEADDD99 +Secret = FE5080BB89ECBB62AE0259C19D220769F70C0E4DF480BBDF71844C38443A5B57 +Label = BED2D92E64497064577950C5 +Output = 5A22B09CE941FCF228560143F60B6A7BD27C + +OutputLen = 20 +Salt = 60993BF375C360C00CA54466581CEF4B380D777C6F0AB2D9D4E18C4EDB588D372905E18ECB84EF8D97550439A809EF358383690527240E3BACA88714D2B790493ED5E7F4CCAE40896A17F19A5101521F63501E29CDD8546455CA0A21E760612EC9FCE78E +Secret = 2C32AF0C7A1961200A85DF39801018DF837346387B514106B68FF9350D0320E1 +Label = E355613325EEAE95BF044491 +Output = BD3BD6DF5EDEB374FABC68A932B81F77E0E01646 + +OutputLen = 20 +Salt = 00E7064D179B9C7AD801C9C7BEA9916ABC45A3D37A1BA818045BD3A222B2295137D741FB2F0558AF3F345AA28F315350FB13B74FA6089967B5D02803865D34887A49EF135BC2755548BAA1E27E540C0678DAD2976533BCE90F977476EB44354C99A052FC +Secret = 06C29E792352EE8CAED9062F4A6C50797D115AFA5BE0FD3F3DC09328D95C7C57 +Label = BCBC2FD762757EAE951FCE01 +Output = EBA167B649F89A6DF5127A3A06C1956F21A4A9DB + +OutputLen = 20 +Salt = 67526FD56A8E31DC0F77C6BADC2E880A13D7B2A184A5B5D08B98327C6850D09C5BF7BF0FE73E870A22AAE23B5117CD5F3EF2AF7D472CB28CC61E3994A51610C8F0E1644C1CACCEED1F44BECDEAFF4D431BB2BDAD4CBCBC659FE06A7FC929BB5CFD382043 +Secret = BAD7C5205A5365E663421BDE9CF2FFAB61400A7AD378FEE95C8BB44D465C7567 +Label = F33E5766E3EE83AC7CB4ED90 +Output = 832A3375C298151C5F8D15284A3431710513AC89 [SP800-108-Counter(CMAC(TripleDES))] -OutputLen = 16 -Secret = a1440ebcdfe3eb349b3394938bc4c3f0f52bffb15ed0a20c -Salt = ac8ce20d7fa0a07e6351cb0435c8e762aee6394f870108c66bbe6d75a1a8079bb2f778b4f896d8a739000731784618086b0fbfa25453c69b8dc2cafd -Output = 3b924d2d2101544ac09d2abe9a258059 - -OutputLen = 16 -Secret = 40553f110d8705d611e690b8443178fac7832261d25f3380 -Salt = 2a6c2bc1556751b6b037a295bf43776da86e9e007fd73d0216fd4c800ee748d67c34811bcbbc0194298f51c8bc573a7a04c5d268ea9eaef61fa86b43 -Output = f4a11d5b8a56f59b4e2393558025dc5d - -OutputLen = 16 -Secret = 4db2a11a51b4b01ee5828f7c4f2054dd82434e87ac17e231 -Salt = c291990ab8d098a779c4d9533380703cc361564acc18b3ca723d625d4bb08aab89a68cae11ec8e64565ebebd6c2d83eff5d34994243922b6cfc0b3ee -Output = 82880640904d8f839ac1e0cc59e14be3 - -OutputLen = 16 -Secret = d578fde895ec195d6ce1df854fa070752c80fefa25e1513a -Salt = 41dc815cf03f9fa05aae031355718e1d0f1eb40f23e6add1f49e939cdff97654c24ac4a6326ae077adfdfc87df177fef1ca4272c8d40f768f45853b7 -Output = 94341103b5599fb6f2112e5ec01cdef6 - -OutputLen = 16 -Secret = 402f2717eff4e0ad9eb72cfd872fc50a2eaf23602bef7f79 -Salt = 8c87054402aaf648290d4959a1b60eea9c720e082ea393ec0b7e2bfb90960f295d98427350f2fcba939be607a7724a151354bd2b9572732c60194e57 -Output = 35c5ea08b4d58109e3424a4e67f91f5a - -OutputLen = 16 -Secret = 8d46cdf9b74cce56705d8bf32cfc61f5dff7ea059ef48907 -Salt = 88f74ef67233541290b2799936c7201356eabcb5bbb27e41e4562089fd5015d015e4ec24801f2c86364b327937793f2dbfdf52912966cf2da6e0ce4f -Output = a5bfbd9f59f5c72a0f4130e3ec8b4a35 - -OutputLen = 16 -Secret = 1579acf0958420693a423cbc0ddc879363669894fff4f8f5 -Salt = ba1a006c926017b8826546f42069b7c1d459fd5674f1f3e015113d28636639adbc806a6b6899fa5521cb80c557ad2406d4b3f1cf8f181225f2d06297 -Output = 4138e18d4328b21642833e61379ed647 +OutputLen = 2 +Salt = A6A85FB8FA219289AA53 +Secret = BDF778CD90D74AF1F0944611CD1A1C2976CC6E159284C0F5 +Label = 068C39D69699921A8DC35B3E +Output = 63EF + +OutputLen = 2 +Salt = 4328CA4227BCC798EA69 +Secret = 1DCC7FBA4AE555A3FFDAA096DA7BD663E6E8CD75328E0A5E +Label = 0BA37F224BDCC2A63C52C672 +Output = 83D6 + +OutputLen = 2 +Salt = 86C8A52CB7D8CC87FC88 +Secret = 516BFC3B32FE8DAF120FB1C91240FE440468186AE257005E +Label = 0A88062DFE588A6841F38B36 +Output = 1C98 + +OutputLen = 4 +Salt = 7E678E30E3F6F402A2E6856B8D5EE0264497B204 +Secret = DD731EC3412CAF0AF2FEA6F714C093063ADAE99D40C329D2 +Label = 3BA55F3C6CF70556E74E01CF +Output = 4E252005 + +OutputLen = 4 +Salt = 5288159C667EAC7ACB2C52C68AF531D0F4FD3813 +Secret = 25870418F29AC8B3C5AF2B0F51FBD495D9B0DCAA03E4BE92 +Label = 6A6513E9B2B42236545E0680 +Output = 201DA27E + +OutputLen = 4 +Salt = A3C74A4AE1CDF84AE435EA8F1CE7C253620550F3 +Secret = BC4A5F5CDC11090F539C5C4E7D5D0EFEB3E80E25E6C3F673 +Label = F22D967E44DD4712B7FD74A8 +Output = A6291C7F + +OutputLen = 6 +Salt = E8BFDF2E2D50129E1327D8DE985F5C4A47BCD596F9045F67049EF351A55C +Secret = 1DFE18D3882F8729C64E9B96DB859767A1379DB559E26AF1 +Label = 5D8E6FF10833BECD9A2C772C +Output = 4B57E2DCB015 + +OutputLen = 6 +Salt = A2424BD9B7A1D67D06213A650A836351BC3300B992764FF8665E22167B60 +Secret = 627E382A51DA40A2D6B9C7BED795C8D15BF54DDADB192514 +Label = 2156A54626E31B4456C3FF54 +Output = 6038BA030D96 + +OutputLen = 6 +Salt = 60AD8774BB17DB96BD05C1A60A655A167BA15D0792614D27B54F8F82904D +Secret = EF1E75D42A7FE359CDE5980BDB2267D9D5B243969BBD8186 +Label = 8414B76ED3474E982962E90F +Output = 27DC49C0BDFA + +OutputLen = 8 +Salt = 2E454478314FCC803BEAB3ED1D935EADBCBE0D7802A12AC527BB6FD933D48C9B5C36B1C53F8B0812 +Secret = F22E26787944EBE49A6E27D6BCC5600DC877472CB624DBDF +Label = 96845D7E281948833F29E459 +Output = 2D815BFE982257C5 + +OutputLen = 8 +Salt = EE2CE3B1B082A35ABF79E71C1F9C75F3238A8EBA3EE223A908882F0BF8B613DA297BE902C04B9577 +Secret = ECD1C68673F82FBB995040873A660555077CBC7B17E0C1CF +Label = C740FB926BB57C44D6C2F16E +Output = 8BA27B481546225F + +OutputLen = 8 +Salt = F0EBFE6941829592EABD8A71857488B35ED5D93E7D8CF93D371DE97EA2C1898B3054D7D649CC3EB1 +Secret = 6BC8169CA6CA3C64EF552D6B546FE4A57DDD0C54503D6F01 +Label = 3878B318640EE4758718EAE9 +Output = 03F2749C12DEF11B + +OutputLen = 10 +Salt = 6E205888864D6804694FED896157433532AF86088911BBE76E3E239557677777348F0943AA90A89E86BD54A78A75079BE31E +Secret = 1391FD1B057CFAEDD009179B6B5E0F8710E4BD18BC01528A +Label = 298D6F0D47A3D6C505A0A4C3 +Output = 3E863174AAAFD3BFA855 + +OutputLen = 10 +Salt = 6F242BBF2EAC721E34337289CD9646548C628C61A95EB68CB91D95DFC7140216D415072754E1DFE8AC322EE0B9BC20A93067 +Secret = 4E7D10E28486DCEECF67E1ED0B4CF9F2093DEDABAD7D2826 +Label = BD8A75236836A8FCCCB7C471 +Output = AD84915869B203556E2F + +OutputLen = 10 +Salt = 6E30D7D659FC084E95B1BC3726AC242D7A21C1DC355FF44EEF3EFF71A7D5CCDF6F857F9F931A6296CC2D2250E94CBE9CBB3B +Secret = 21FFE0455137C46A0AC0EA14280CC89EB333D84CF1AECB97 +Label = 74AF3408E30516917EA77612 +Output = BE19097607F2F8A47200 + +OutputLen = 12 +Salt = 61345155587D925DEF3A307E37A27F707B655FA958AAE69D8E4CF49370BD05FF7412C1AEEB754487DC82A3740A772B611E456B544D53453B61720325 +Secret = DA5A847BA7C8DB881F1019D76674FE3EF30526FA3DDD5C42 +Label = 42FD3EB3E17B8661AE3CE858 +Output = 8FE27E4E0196A2EBADDA302E + +OutputLen = 12 +Salt = 3F8726D71E4F218EC56A18E886309228C5C05B7BC4E8C16874210900F15B46E888756D0D4ADE1A1DF5B9B2D3862EE7D20D94CA2D12AB4FF4DA72478B +Secret = B4C06A341B185C252A41C331028DF57ABBA75457CAD49678 +Label = 99A17A32CC54C51221D7D2B6 +Output = EDE60A7709A16742FC4101FD + +OutputLen = 12 +Salt = B9E16129A7DB58FDFE6B23F7CAA4809BEB00F5DB54F4616604DBA2DD48CA854682AC11D4AA0535D7E5523ED0ABF01B05B1A91A2F719DDE8DC0CB2AF0 +Secret = AA584848007C4A2C58FF11B9C6FD6F7D18694D09FB0337CD +Label = 57E21B0EE6FAA71A74BA086A +Output = F8A7457360D3D6C6AF1F0D9A + +OutputLen = 14 +Salt = AC331E74C425188CE0943E90FBD0A4C78C044C80ACCCC3602C3C5C66895C0148F94687F1B6748B404F7D63AC319544484E865968ED6472D921F3E487CAEA6B462EE21C1E1313 +Secret = BA189F9AE1093FA4C391CDF5F58B9B1AC6889466DB32929D +Label = 0AAB5E7B34886149C86DD182 +Output = 720D0127308139778947FAE4F66C + +OutputLen = 14 +Salt = 3957A0F02BBC8BE50A766A99A493026ABE0850C2FF83F5A882ADDF1848FFA342BBB6AEB974180B0C02DD00ADF0474E3AC02EAC91EB46A04A1C5B3D20B77E8E6E78B073D33930 +Secret = 7BBF77576C3863E611FDB26CD46D9C71A2F5DFE1B5FF33FB +Label = 9D1516D1C49A3D24FA78222D +Output = 0984E05F40A85A12657303654D1A + +OutputLen = 14 +Salt = 99C27C99505064DD01829AAF548813FA20E64B06003C3A60761AB5652469F3CB2094060E4ECB8F74A206B167D8B2A24ADFE0929C9F4E24A5DE91D1D44923FC38EE12DD98DC48 +Secret = 0982CF5441C981925F019280098C1A7FCF03B3C2461747B2 +Label = 87BAC4B204E1B37B30D94C70 +Output = 470C13C7604E61AB59242A67564B + +OutputLen = 16 +Salt = DA9C793791B62DBCBEFD81A09E02B84C33D0DBAA7645E3EE8A610077308542484D83C3767A2B494B83D6767337847D9A8E0F7DFD8CC9E47D5F5BA8004C8EB8D38166D6AF2CB61CFD57420A23B41C40CE +Secret = 9F356C89A06257C9816763D47DE2B4F0C122963FA9CB667D +Label = 3CF8F4F4E1DE90080D39EFDF +Output = E8C741ABFD54EC531BA520975CAEB453 + +OutputLen = 16 +Salt = 15826390BCAD45A314DF53420433ED7E6964D109B95F936A8F82322B5FBC619AE9E58406E53B091CAC86212D04952F8929074BD60ADAE700C689790ED2D54C6B77E5A41028AD77FA8376C334A22FE979 +Secret = 8A6E2BE368BC5021261B622B30BC4520D93D365464328473 +Label = 5BE64C27B392ABD911BE532F +Output = BC149FAE8481C96AEB664FBC01702197 + +OutputLen = 16 +Salt = 3044DFBAA3DC7A37810BFEC2AEAF2F5FD9F6A0573FD4B7A8608E42A64F8F4111BE1B33B40261297D8909F9B5091B87BD28F5F5F638B687F2C8C3B306B94A3DD53E12CCE32B917321209E0F860EF44492 +Secret = 148884186A95DD8B8557AFE89AF1956361FC70B7B3C77D3D +Label = A8F2F03B734A520A68EF94D7 +Output = E530AF9DAD15E5503BEA1C6E60E917D8 + +OutputLen = 18 +Salt = 59549DB0CA2ABF65F8ACE00180486DE7A370F40B822F84C10CAE2F6570EB669E29F85CC8826BBCCE2D0723BA51AD79CC013AF9A69C024D19334341B40705A8B570DA8F12461A8A528B13889DE0A1DD30E2A5C985E8055CD07FA2 +Secret = 3DEA759AB87B754B2B5189E08F09600D3261ADF445011788 +Label = 18259648274DDAE7DD2BEB39 +Output = 5B337625BA1E8D7AB17192B478EADBCDF916 + +OutputLen = 18 +Salt = 92FA5039BA20F507F950B52ADE485CAEA23B57B068EDA002C02C7B7D58937828691CBA0B194A1BCA110C1D5B5355A64BACE79CFA690F818B7B2331B0241A604388CF55BE79357FF8ECA47E547ED6AED363BA847F0F4AEBB2DE0F +Secret = 3B2D865CA642E4064B5004B00314CB182B2CDE0DCC438F03 +Label = AEA3EB9AA50CB4950F342AF4 +Output = 3EDD883B5CFE0E5C82757FBBF3286CDFBCE0 + +OutputLen = 18 +Salt = BDDE9EB1DC96380C562A7485C078806577DB60F0FBF2C800FD2A385BDE059EF1FD77308608CB3434962EE59899124190BFE7301E4D270595B356FB3ECBFB97C52DE23FE3EE54C0797FF6DC28F563794A186843E301F3AF321F0B +Secret = E9FE934BAD59C23AC806FDDEB0F15BF459B7FC4DCE77BC1D +Label = A9CD6C999166F68135F009E5 +Output = 64B4325B0EFA6BB8B9B233D49383F6BB1933 + +OutputLen = 20 +Salt = 6040D79D1CFB9E34568AF6354CE68A52B0C3B57CB0172AF7F7BD95479F88A168D3BF83A0CE5BB875D9EB9DAAE8B46BA24776BB199056F73AC246EB3D59DDB0295CE93DB3DCF2B3C9B5035A3D6FC9C9DB041E5E6B6B00DAA99CF573335269D5AFEF9966D8 +Secret = 311D92B09F64BE1BBF368D6422CE2EEDB1C7AB4B1C7A1A2A +Label = 8C7762B0961458F959D03D6F +Output = 35642BCC467174AB76795970B75E9BD5A4CAF06C + +OutputLen = 20 +Salt = 83E7CDEB8181238BE8E487999D48DE22F1A36746B3763380B848F1FE87199FD12E917F24151D9B0FFEC9825CFC26E2EF1BE3895581046AB84A9E57C53FC7F0138F107D72E7CCB6073D027925CDD2235F658879098453AC403FEA8FA5E273048F835B56CE +Secret = A2760D029741C6715CB2D3347C2567123709706765E5F29D +Label = D8FA20061ABA9E9F10D93DB1 +Output = 758B0E239A3ECD6BC82391FA1D6F69E9B0381BB2 + +OutputLen = 20 +Salt = A73D83957A2431F455172415D2A8C9B5710CFD89C0A378F422ED1B1FB56F6DDADF14313CFA6419B24338AE017A135C1AB6CBC2D29D3F1D63ECEE67BBDCCE0504D86B7A69C9C06AE481BD2C7E1D310C671B255214932706C1AAB830B76C82CC16B9E7B465 +Secret = 37FD2AF3B56B09CFB562BED2384A6CCC852BA0180384DC28 +Label = 4578AB16CB1FDE0D34032F59 +Output = 0188BF34FF6147D7959059C33A4FE8CE8BFDFCFB -OutputLen = 16 -Secret = 3899f31a29433732a708bca69cab5f9eb652776f93e475dc -Salt = 93b280dd264ffe02df953b087c28a9055da0d635ecd86dda7dae19e930066f2973e77cb89c72b5840a5208e447c11d93c0523cdb2d94c46b5668d1f6 -Output = 42e88113df5031b0d0a89f18e5b734d0 - -OutputLen = 16 -Secret = 7e424f13d2305b0240dfb7e576650433164f4e705e0704e9 -Salt = 3096bced1f78d84d360f51cf8306ff07628bb73706f080dd0a2789e916141e965f03a8ea6e03f3617f8cb7b02945c734b3419356dcfa6135322e500b -Output = 66053bf3d3ff032d5dde79444e7c4345 - -OutputLen = 16 -Secret = e371bf5f4bf967420d3e8e99dd3d71f3674dff3beb378b8d -Salt = 2c71da3c85dce9fa5c2dbbf574960029b8e3b9ea325fd288c924702b11c54884d03f3fd7a2bad08c971b55258477ebd3b1d53350785dc3ccead23917 -Output = d483c1e6ae88301e93474e81b6ff5614 - -OutputLen = 32 -Secret = 86fd933ec93f7f539c9d3a343346453d72212b399ca2b180 -Salt = a3cb03fd5b9453ed3d73eda5a96a85c2d6322030db9640ab15e6e83dc8cee76346a1322e6116df8b98914e87b64b6154d2b8b3e92dcffd97f2bebd84 -Output = 3a58ea928664cfa9984a09a21f68316288c338d07e5275addef2368dc23db391 - -OutputLen = 32 -Secret = c148c61183af133da29ea2deeff849befb2275eca8c81db1 -Salt = 606792dafb70b865f9ed3eac206a021a1cccb51c5682097838829783368cd26b120cca3ed83567ffdeaea33be6a6fd24304dabd09cf1a2defe7e798f -Output = db729a6cfde860e947b2d29b68262b8aa94c1a196e78e89d8e4bef20fbfdf3cf - -OutputLen = 32 -Secret = 1fb1d84d3a404e2be121e8e338269206424356b748842096 -Salt = 1e96745af8f934d3d14ca9b94d638d91647852fe7f89d3f3be5acb5eec96ae0ce05603ffe57ebaf8dfa6967ed1b778251c6d7ea6decf6da3cb966e1e -Output = 744c5c920674da797dda5c91dca0b80a08cdd3bd029b3d7bc0918c247ae204d6 - -OutputLen = 32 -Secret = aab9fc003a2e5cb2851991f260725cc2277441dd6e363a88 -Salt = a9ef1dd2428cae2db40b21a66bcad721ac0b66741eb79743d3e288213827953c7a0c92b2e9a5f08da5726f9f2777d20bcfbafde3e2902a93565f7e19 -Output = b060aa935c6bb2dc412f4554038026f543f633112c601c0decf8ad3109415602 - -OutputLen = 32 -Secret = 50e58da627caca4ed17d7c60c440cdd98cad28724ef4f5a9 -Salt = a7a63c72cd834b79923c759a469bbd73ecb3a150b86bbaf4be271b99be909370e5195392bee71f83e78e7222c185cf47582b27f7da2ff55714b8ea57 -Output = 89e3ba96756ffcdd220a4ffd3e911745564d0b8344d64429b9f28066fd886934 - -OutputLen = 32 -Secret = 94febe5a070d76c876765d4f64a1962690da16c2d9c10302 -Salt = 4b081c5180cf185a41c688239fe7fc2724870f4215c40a30249d5b10c957e3488e1b9fac960b48b1948cf01dcfefbcb606c6b6e9455fb5e45c9b3122 -Output = e69829bbd3864d95b8b2071449f66f425def2e43e31f297b6a7ab4a70f0ca7c8 - -OutputLen = 32 -Secret = cf1ad46645bef1118855c0bf63f2a6b21d4649051b451780 -Salt = ee4c71f7b18ffe81f286af555fff2b6b00091b945ce9d521e3772260b745627a756512accaade1a46be39a97c744dd6c864ed7ec7cbe339a4388eb0e -Output = 383e7100768b2ad915ab8ad0a13528e9fb9f43e75d97ff75655528df42e0ddd4 - -OutputLen = 32 -Secret = 10d5ff1915402a30d135c7aa1ae717b3a0483d779faa8a01 -Salt = 8e91a01fe57e29d53ccd10f0b65146bd8044f8dacdbf1b00b00ace379a9deded93b2698ac51ce6e417f1f1eeef691f2dd924272cc61e206c7d4136f4 -Output = 272c05eda1927a493e9d11a4032470190f4ac4d2d86dcf3851fada23ceec0a2a - -OutputLen = 32 -Secret = 67c3f356daee5fd5c538ce0e71ac4a89f0f3c93ec5eaea9b -Salt = 5002afe495c3366765554b84caf503d9fb4ccc381280d86733fa518a62f506f1e6736143635863ad157d2d5da46a8b97b8a5a1746c4b905f07c4621b -Output = 132c3af9f55f2fffedfb89c555065dbc915fd7966b05e3782465212a64077e10 - -OutputLen = 32 -Secret = ca59444b4845455d4fb0ec8d20b0d6917a115ba9cc346e72 -Salt = f6543235aa96c32967a3a1a03f40b885192da99ce55b929cd11663d234ee62ab47236d05337ff1d8386c1a4821ea3d8d885dac00a9a2e50c6474dce5 -Output = e4171bc06dbdbf017e50f12332307cbabff4eb3ef78eb80685c45d7f625ca391 - -OutputLen = 20 -Secret = 96b3eaf1872ab7aa0013d2b9f6a19ab16650a98f8db218b3 -Salt = b763e29a38579e91a2c437a47a8073aa650cdb01aa277affbd652f18e1c145d44229dd4aaedf5ccd7b7bc7b15d06779555db080e5e6403a78900c62c -Output = 05774c73391ddb0582c94f9211ae9640d1d07038 - -OutputLen = 20 -Secret = aaaaa7fe8d320fd2593b1b130014d8e5403cbf029d1cb01f -Salt = d7906a3acdd7056bd35fb8853a65992bafea14df70cb68492ae1c6af08fe1f771c99b1a6bae51e2ed1f0624763928487bd5102096b0ffcd409371fee -Output = 24fad1c8269c9d59843ab8ad4a7b472b4f541bbf - -OutputLen = 20 -Secret = 9fb69b42cc13357cfdaec0923eb5b838b26a594503f703d9 -Salt = afc275b0baee13a82e13c19add2eaffec2bba709a3802dee99236d7a1899a44c2b3dab3823bfddf84cdd9f808077a6da02bfb7e55df19d638a12160a -Output = 3bbf9f2732ac8cc92157bbd69475683947a8dfe1 -OutputLen = 20 -Secret = d40b05536c77905cfdbf2840771395c1dca34f9851b8e5e0 -Salt = 008841f5f0de7790b7df3d3b240b6afa1f185939ffd76993ced84d4464a6c5da986a1143f84890304f460d4b1f66c058fd884f3bf258febdbdd3004b -Output = be9e298fce587c0ffc2052602392a5c88e91e872 - -OutputLen = 20 -Secret = dd7ec4e0c09e26f07c3dc7a00126168f42f96efd5d8a9941 -Salt = 6a602a59a5758995cd9dc9518e6aa49b67f076af029bd60a92ba4076a53f241da2dd76a3deb7f6b7a6a86a532cbf339d3a4a6350c2c766ba262af4a8 -Output = a69033cade7b0b02764d73485d1f785c8a6c76d7 - -OutputLen = 20 -Secret = 1d0677e2ae39ca4563b16307855b9be02e9eb9a04f62e60d -Salt = 17ddfcda90a9afb9cf86617292f0f088e2bdb6d10d6e12ff48d69a112f6cb121e24a418f5f026ae49e124aafbc38066cae88b5903f83b3c4520d11ec -Output = e1097d04af2252b853fe3a8eaf008cfec0f0d721 - -OutputLen = 20 -Secret = 9d9c607e738e525768bb4ccacd295943a8141ebf2223b5e1 -Salt = 6a1a7f6421b5f904c018520725d06b010bf750bdacccf6a831ed174c78d127c7f02b50f9491a5ba127b26c928ca99ef7dfb9966cc6661e16486daec6 -Output = ab3f45afc4f91296608731b2c61a90c5ac61291b - -OutputLen = 20 -Secret = d810ad2b03fe9dd6dd70f18dc85c29597d0d54f2fbb9d70b -Salt = 09f54edd11b0b59d47cf79c5f4d56a0e7934642b28edc1e5e1d1da51fbd062876d230c9e3bda4461715263b006cb0535a03693d4733d498634a4b20c -Output = e67d333266e5747e2248c43fbceedff839b8bc0f - -OutputLen = 20 -Secret = 8ab43ad8471e7b2d131986a7c7aa2a2cd7f2e03b2310a4a0 -Salt = 79c9a8d007624206c06beec3a658e3a38dd30cdddd238ca9fae35475085be7d6aa09722a7d6286d8a13f318598adcc7233d889a7cb5529cf879d8c0b -Output = ae526f8eb3d3f8ebd672dbd10877ee37693e712c - -OutputLen = 20 -Secret = 473ac66e83a7a71a35c582966b963ac0d928b11cb0ff60a5 -Salt = 01fe5910d3243ca45f5065b456c38413ad11d32008042d0edc66e9489e8c4e622e85a036728c940a99442b2182dc6e064b4d236ede961a7aeef2f428 -Output = d22a29e6cbb7ef44a2a7be32637e4d08f678a70d - -OutputLen = 40 -Secret = 25c65bb4f3a2ac678d4b51eb6f2d07860bce5b9472254aea -Salt = f0769be0b180f4c5d3d949aaffde49670491a9cd513d176f3e5a293b3f805499d6d6b224a21b6c3b837f1168b57a7033fe5245ee9230b4ce30d5d320 -Output = 3a36a64f140a53865ba7f321cc32c0dae7ae49f9005497e251092f26d923210a8f97946c67988a90 - -OutputLen = 40 -Secret = bcef65cbc0559186e0ef4ce5bb00627e649a3155632f700a -Salt = 182800ec6d11251727c18e35ccec77dbc6e7d6ab8fe69370ed22438d520f8efd289eab68b20c7aa5254f5664ebfd234bea8a39de6aa208402558dab6 -Output = f3ba92058e66dec30881678d96e5dca0ab4a9b4e493ad06c7465fbf8ccd1dc1b63c59528e2a3f7c2 - -OutputLen = 40 -Secret = 3211964b96ab0931417a69069380365e51c19fcc6fc50f2f -Salt = cc60adb3fea0d5b44049dfcf5f4a9c3d2fb190ec2fba63053089deed26b797eeef70d426cb85d7b096643674f0503ab3c2b8b74657034f26bb866fbf -Output = 886ab58dc7b006f479b00960dee15da2cddfb4764dcf9ae88af54d9c1c33d469bdddc6caed4badec - -OutputLen = 40 -Secret = be1208b2ea36bd01945bb60f20fe87d5c56e0acda67c7f60 -Salt = 07b6f474b519e875fe172fb29bbd4fe4ef3776e7bb9ea84889c074569e78d5ba0a86f023cf844bbb4cc3790689199c5b2d8fcb60586431167b6c01ca -Output = a044d47984a0f7f193e7e139a00711fd2f81ccbf78c69cfc27ff6e822f8c5d4fcd1dd7a12158fb0f - -OutputLen = 40 -Secret = 97c3d396bfe4f27fa2dfbddf01ec7d510c55d32b8935e52b -Salt = efd85644968590793fb6c1348ddc2727e97d00b6c0ee77be19327f4d07df4291dc263d861b76e1011edd369d341c25b45c3515b6ad6d8229de07acab -Output = 0db6bab4fe1dc0a354309e3173c677b5af78ee65439bc954f5da6752234144c400dff0b2bb30d05c - -OutputLen = 40 -Secret = b81c606ec641f78a5a22eea5c71a0bc8b22659f9643160eb -Salt = 16cd74cadc8b936e327e403f825f895588d4b42f54bd8a497d97f823d3f05e35664a852cb2691a6d45750146dfc207f8140cc257e692505d9d97b062 -Output = 8e13b0fa458b7a517a5c1375c2c6999f11d8a6b2f2daade9a13348c117235196ed35e1a6a83f69f3 - -OutputLen = 40 -Secret = 8fd3390ed691e8916fe67796bed3e3cb3cf49fc61f1e29ee -Salt = 2782cd47699374db10ff9b11730ddfbfd983240184e5d0730aad2ba187748c4cefac51a3e12b0f2b367d344cfeefd53d8a410748cc82afdf4a128ba6 -Output = e6fcc2b8892cad17ce29174039703189dc1f4e4c053eef82d353390ada6847f484aad37f3d2f3233 - -OutputLen = 40 -Secret = 8f3082ca0478e347b6f1ed886a482c62825a3e5a745ec78d -Salt = 18e46586147c1eb45b7bdcef74ac5f0d7b9af7dae9866644d85e7fe001ef2c7b3725973ead0663405e4487fda08b4f8047f1a8780e793c03ad802cbc -Output = ac37b620a90b8331b433757885169c2fdc3657406adf73332a77e71c4f39263e94250f9d9c4e5c82 - -OutputLen = 40 -Secret = 58889aa174c4bf7c6df6cf9ab24f60da4be118762937d8bc -Salt = 4905e196b960844e6482497f76fa99e812a71fc5d293c0eab8c874134294cd410e8f7de737a6065322b7c55e8fcc76eb8b3bf774187b82e8cbd8b120 -Output = 590f5615bffdc05846cc01aa399ec602a29f6a37e06aff9e10abe16f2b606c795ab44af5fdb4f9b4 - -OutputLen = 40 -Secret = 55adbc8bf006a13252f07248c1e86b6de798c9ea980854dd -Salt = 69a3a77124ebc5c9913e211673d06a82e248f51f47bd209a22545b616a4ba983e0ce3a18258f7e62a10e43d2dd050ecb4c46e866636e181a04db2fa0 -Output = 16e141db110f20b5f513bb4b5fdee2786bb8e2c252ef0dce13350e30f160367eca211c307580b458 - - -[SP800-108-Counter(SHA-224)] -OutputLen = 16 -Secret = f5cb7cc6207f5920dd60155ddb68c3fbbdf5104365305d2c1abcd311 -Salt = 4e5ac7539803da89581ee088c7d10235a10536360054b72b8e9f18f77c25af01019b290656b60428024ce01fccf49022d831941407e6bd27ff9e2d28 -Output = 0adbaab43edd532b560a322c84ac540e - -OutputLen = 16 -Secret = 3a4c31a157cbb582e9dd0780d94abb400c112ca1e1b411572163ef3c -Salt = 99731773721e9839f4d2b3664b95bbf1a681516c2a965918f74a35b98453b676fabb7de03b59c0a473aecb82b1feb767d243489760c9c7c58c4a3046 -Output = 0633950cf57c0f31717a6287872d1d2e - -OutputLen = 16 -Secret = 340bd8bbe90e7c1c1b4d5d825f982b599da3d5aa988498ab58279989 -Salt = d5d2238249121975a3fcb370004b7e3c8e325550aa0e239920aab53fde83b9e5afc34ae5134a4efd75197ea3914867a5781b82fcfab7437f895fe4ef -Output = 1d13573cfdf10f3b0a312d9746f7670e - -OutputLen = 16 -Secret = f3371d6238c88991815c8acde4fe6de6214be0a2ff2839ecbd681746 -Salt = 37023f83828811685b548e4280c0c6bbf8ceb5d78765ef5149645cbba93f68eb1ddd04b35fc77ac578f2e760c6d5652208acccace6322d98d9a842f2 -Output = e9c877b5a3cd016ad3c84d1ff80b30c4 - -OutputLen = 16 -Secret = 1c0eacdba64726f34864f5bba0160ecadbb6c358fe38eb3de189dffd -Salt = 2bd19057c9cc632bd9dd3a2afe06d8123d6a945a07537e8e7559b458682040ec9c8110ed102e64be9f9c1feb0e6c13c9c43c4608d0d7e811d728bef5 -Output = e7f5d8fb778fee94078056455f790486 - -OutputLen = 16 -Secret = 5f20118a8606e70aebbcfa1bc07a3955e544ccec157257ae337fdd87 -Salt = b8bdab1f11b2880394fdd98600806e22857e94d226211d54f243975dc8abe90dd7e4970909b75ad82e39b6688ef06c9000f67a498cb405b219a15495 -Output = 24997f413e4edc5d6d6c0a63170a60de - -OutputLen = 16 -Secret = 9998bd669e04349e7a120a2a3a3f7bc54cd4289fb9f9412e120fb01b -Salt = 0a929f3c9b827d51b5763cfd1806367dabad023479fc0baec03ca574b6fd73d235f286092dcad90925ec6ffe92ef3636a5c4d00dabed22728621b128 -Output = a8e670ffcd2606a9722f1b43ee82f47a - -OutputLen = 16 -Secret = 31fd195394e4080088b384313a1c7ab5d1660a897cb030a6e2e9bf36 -Salt = f2971ef27d522eac535fac995904ffa93a2127317aa18dd36cdd1d6434bd6729d1dbe12d7817a4f6accdc0c34d5a527c9ac85954a35c780fcc8dbe61 -Output = f267a1ac27e60017409c83a264df5153 - -OutputLen = 16 -Secret = ba6d69db3bcae0ddc248cca017b6c9ef63a516f1db4de8420691c62b -Salt = 7b6d259ca94a12ed57efe2b50d2ac8f2b31ed84b4861ef7352af69da1f758fbaa697823b5e666ddd976badaa2cb32d807b510cb97dfe82cc53a0d9bf -Output = be9667f26f8d249b1e3bd990be9fb852 - -OutputLen = 16 -Secret = a1c66053dbf964c75bba662ba98167eb1186b85a6f05875df7870c9a -Salt = d58b7542d10840d69f0d7f5e262e11056066d56c8da46429b4b8ca306d9d958297f5153bde6150b2be0a1d68b8055d68fe52d7a35ff1da2ad349208c -Output = e0a33e714389b1828fdeeedcfad6cdd8 - -OutputLen = 32 -Secret = 992815121d88ffb26c337606723c02ef317713086e2cfbbd37e1a167 -Salt = 152d974eb2719b9027d32054a327312361125959df9d96a1832e2056c2571d4f1cf45f6e8f6544c87f15861cef627d2f16e9b0b4ab799bb3362f4aae -Output = 475eda3a32d569932e043db64dbf0e9bb0945b54dcdfa203be1a28524c147075 - -OutputLen = 32 -Secret = ccfc859c11a3e09e1b040b701fd8b962a926a090117baaa80c83e2ec -Salt = 891f07868ab6a6c5498e7be85b1e3d5baf3c415cf5e0aeb7c9403953af6492a5d78860fdc0f61ba2c4af55bc3d504fa1c7b40ad0778f63f79b164b64 -Output = adb7d81ba3da64a3c49e30b1e866e48b0d0009ae8f38504a4a5925484c115614 - -OutputLen = 32 -Secret = a0631318e18dd966b6ec51e7aa79ac6bf9b63e321ea65f576de06256 -Salt = ebf1f616cd7186e82de52c843b6276939c6874d42b818acb4ff2873546c8eafcd845273756f3c1246c151e9c10e507ac21670a517e0a3e0e41a87703 -Output = 2b8ee73d1833b93c8bfe27f866e1836b8c433f4f9ceeae22414ea712ae263d7e - -OutputLen = 32 -Secret = 326158a34dd69886866aeebddfde012a966cede8588b6a57ee62de28 -Salt = 6af7d5d0732466b97d046edebde3148e834b199380bd6f99f03bde26f0db8d1b36ff4add8d89076ee5b1f68338ed5364bc862d66481abe23d596c3fb -Output = a7fa9bef12384b9e425d995ac1d3c5d1aa34a80a8db0deed67316cd0343625af - -OutputLen = 32 -Secret = 4561e942572882fdf78310603c3e9ea60bf336f6841861a952c6c8cb -Salt = 0ba54e7079b9b3ef55cbdfdc59de9ab60837654196c17ecadc3c47b4c9ff161a226c4cdeb5adf141b671b50a835858b6423bfdc9c2e41c51c3cf407d -Output = 196f00a861c6c40fdcbcc84e7594ace32d915f7ea83702ece5635d8657d4c939 - -OutputLen = 32 -Secret = 7453ac0e9d1b2ea05479e616f1bc878064b9d4b1edd997841cf128b1 -Salt = ead0c5a343d8de5a62eb57731b64b0b7e934d75c5b62ec683cbf61776bfa77f20da8dc6e287b1f4918b1dfbf402af935258b11031ea1077e5a775bf7 -Output = 4a68c827679eb5c45b61a112800d9cd75b40e8975e3a36c45136418e20c2fedc - -OutputLen = 32 -Secret = 6b3f84c2c9a976229d533172360bfa4a3282b57b5f61e64c6001cf37 -Salt = d5f2dc8ea4e349db04075b936b056a995af6a10bf56c8a10b1ff9cbfd82023fd741ed7e44714526b0d8ccf4e6c57854911871154a3ade06dd5a8c0fe -Output = a8abbaa980c9e3c24477155ec2a790578b1e3a5c8f07cbb2b52caa6057d47377 - -OutputLen = 32 -Secret = 01beac511b0475dbee4cd1f5e5e8df311124c45adac217ccf2996dab -Salt = 945da8f28e38cb09e7b6130e8c44db4fc4161eac33cf2afa20eb7b15e072419dfae1b695788c03ce8518b9e9d7ba3efad21aa9fd333a6d25e9b4dbe7 -Output = a2434c0c0ae21e7abf7d56e475eb49c43b53febd2023185f851fc468cc9f6cbc - -OutputLen = 32 -Secret = 660a01c4440dd1c98758bd00ad9da95bdda2606aba032bd050eb2846 -Salt = 54acc87802993bb067cfe993b5eb8117d5d6352ae20cd587c254215de649dc100a8a1ec2f58dd35e9074ed592f49aaf67f971a492240dcdab5d25b83 -Output = e27e21eb833f36532d16c270ba32fcd5db5aecd71b9b5d74805da9410cbda0a2 - -OutputLen = 32 -Secret = 0771372ba98de7e6d6f20b45c2136be8f8ec64a36d064df348c76daf -Salt = de4776058deb8e18285b3fd5745ace98eeac4a1cf88bc34384b299168a394784b8f2cd4c92cb5c07ea32695b91fe4032848d68131b00a6cc0986ce77 -Output = b5f6b64045865b60fdf01c429dbb327636cc3ed72aa8bfa9a0afa2f58a4a7f93 - -OutputLen = 20 -Secret = 2eabb6b922c24326ef9ae3c192dfd341caf57efe15dd649772a2ac3b -Salt = c75f6f5a1561aab39ea0e22702a6cf7dba3ca4dd9f046bb0abea2d3284168fd9fb39ff725523a660d21f8c2ade03d18d4273c52fb6f22c9e39d6bc2e -Output = ae50acebe308a1cf1747b9b178a0720748fa5fe5 - -OutputLen = 20 -Secret = 5aacce1b705c49a20e2e3396b1f18f4421e077517534dd3f5185f604 -Salt = 88a962cfd6cc80828eb710388630a018022fdf891548e352897c720da65223fb2a614e692c5bd030da1d00c9c6bad19abaf879f05d6b5c2ddcdfcecd -Output = a94a9fa1eef2f8211c3126015b2cb9b80f77efbf - -OutputLen = 20 -Secret = 3c169fb95ef27a41f19f9140730222fbef395848f7abfa18ffd00be6 -Salt = 054f7d19d60b27c51771ccd20c3e89410b54f6a377f3e2eb553c47c73f622b480c6087335e99238579d2f420c06d61ecb7cdca3147da4df1a9c74e0a -Output = 7c8708d37b6bcd8face6f43cdfa92948bf0f22a3 - -OutputLen = 20 -Secret = 9b6f9d42ba271cf808b5e97ea9f39f21c20ba2e82d168691acce3b7e -Salt = bb96d79c3e812077acb85b7aaed41f9d2113e01ffbb80ac6d3aaa22a907305f0ec309e7dd2155b51154b8a985fdb41ab2890cd5c8c2491ad5e504e12 -Output = 9bf85c03596099d23c89f9cddf9e82354dc26576 - -OutputLen = 20 -Secret = 075407c059e0cd492f1a1577bea6c4e9d1a43ce8c967d52f01efc50c -Salt = fe789ffdcd84f9384cd0a8893462a90f4235ddbcf653f45bfadaabc7bb5f69ea6be4d1af867289087f3dc2e19ec503f52ed937b54e9e8af5bf6f128e -Output = 12b6ca4dbf85971fe20855ebe95869fef613c1ac - -OutputLen = 20 -Secret = 5065b78bfdac54246b850fdabdf92bcbf91d467286acb33f9eb08180 -Salt = f45c10d9398f005f87ff1c483f8b9e57280cc09f64603bcc5ecc7074edc34c5ebc0ad3a7eccd51f65e3ec4ed9e4fb0d4cb48ccea98ac1b5e2756a7e5 -Output = 420d512f8648795d2f9aa8844c35211c5e639940 - -OutputLen = 20 -Secret = d1a65593c5e107a2c44fa9a76edf4a1eaf8b9546c400a4addf1fd44e -Salt = fbdc1b45dfcc00ee47b823ea1faff569ac81e89d56a59c99245e8fc3594b7840a44440a84cfb157055219d987a1b7c97d3cf846370501fd85a565482 -Output = 04bcbba081a44da05260171d12a4c70b6197a925 - -OutputLen = 20 -Secret = 8c09ff58b9a450b4b9377a0dc5b9259a9993e210bb97dfd1b05ec943 -Salt = 4c13b0a6ee08e0e288f4196e996729701c08dfb7e8291ba2eaedf7fcfe021a82c692389b1930b7de0f0f8385f214d815b0fc7aad36e809fbae181cff -Output = 498606e999abed1cac73244e1c93581ee1de7bac - -OutputLen = 20 -Secret = e7dcc3d00f3fa68aae63673947f955199d15dc3c27d162caf7a1034f -Salt = 7ec8aedb4d6e2b7471318d7323169e142fd05919b87e2bc63dff961e103c20fd2222f53a90d70ae3937a6e719b0a2589e6be5354ef28f53cb9275eb2 -Output = f7c847bbc7f08ee95526cad02baa256fb6e765f5 - -OutputLen = 20 -Secret = c6c419b644162c7c4f6f425dc1a998486fa0bbffa0c79ebafdb71bf4 -Salt = 15e4766b71436646eeae2d1bc000b63fc0e15d30b8cb94384016c4c47c072e2aecf8787f15b07055ffb1f079c1450b2e476c8c0d4d2d167189c1804f -Output = 34aacb532e3b80d765cc50746bd39eb5c474ba59 - -OutputLen = 40 -Secret = 9b75e7fa216c884037c7d6953092ed335c4efd88ca57a742d6ac3221 -Salt = 12bea97865df99315259ff620302432ecafc9dce2619e87dfb4979410456a524434315dd3920e2b1aa1c79d5e07132a758a7b7b71ef10bcf1bb877f3 -Output = 60071bd0ceea0fe0f879223b940d3de7dde02ca6858f8450fb9c0032e49f968ef9cd9b5703163dbc - -OutputLen = 40 -Secret = da64a85342397195d82b80cb97e4ceabbfc69da59550c0510caa2c11 -Salt = 44cd0cdb69e3ae5924ea7a23376f35ea93d0ed3d47dabdee1ed987f25851aeed2c57ef8663c7596baee218c9c7465b980649b8367587674e3864443e -Output = 12fcc2d36c31ab49554f7f1500db10fbe4193282e2d97c97670ff50e3bc2298507db93333cae7a42 - -OutputLen = 40 -Secret = 19819611994e88a91684516ddda11c8eedb3a9692408a8502ce1c260 -Salt = f1d9bffeb4a16ca4cd9002f2f271c43bdb42f0fba251045d8a7768addde39c6d6052b87d0ee142d96e52dd3d7ecd589b3e4eb63d3aad579014a5b991 -Output = a94accc3e1c4cc38d4c55dc9f187b695411aaa32146b47580586b9d636acb4e33d8811a7ff4d4d93 - -OutputLen = 40 -Secret = 5bf0de4077bf852563203c96a65ddf4e648adfa00fb5214712d2f53e -Salt = 46e3da0344e83d0bff7f43527ec09e873f00b047819d1250f0865c4df992ec3fe25a00fea9e1d2e301ba8f9e465f146f098749427b3c89488bc3f5ad -Output = 8024725477b245bfcbf3ae25870ba2d20ac0242cd798c6149e9cd7cb5160c8f557afc0e6b5502801 - -OutputLen = 40 -Secret = 64b0027ed197a27c65b6245643aee128a83baa9bb0ad9548710b571d -Salt = 2e1a6f58e03ab853c8d3519cb41e4bc36138de85b4df1a30cb997a2426118596b7c2c4010da8b229729f68aa6fa69e878294da8eab03198c97c1635a -Output = ed56c0496ccda60f1b6b5ea7a61955a498a17f0e3268b753a22b8bdb6e8e5957ada4bfa316dfb704 - -OutputLen = 40 -Secret = 0ee16f95cac83113d211e8d569d5b176424dc093fb8651c3977fe2eb -Salt = a005d7d8defaf6d6c396d3ab679b39cd4fa92aae85d3720c19c865166608b3218dcac9e25558419f9682804ef0ee86ef3f002cb3cbcfc5457abf1013 -Output = aa54eeb7cc564fee5b21188822dd3aa519b5353dd1bcd706d8d3b8b05e600d0a581a4069582ebb28 - -OutputLen = 40 -Secret = 8536277459ec82157646eb93b7ea980ccb982691e9a87ccd39419b1f -Salt = f957f6f513c6c112d02fbfab6b8e0b7aa2f63947bbce7cdc261698c8b14b3bbcb3056bd71c9e93c2e51f16cf275de115ec522e7b58e25218574580f2 -Output = 35cdd49a88b43bcda06582ef6b2825583070455c3151c7e48fca4579df4c73fedf732ef5d427d8cd - -OutputLen = 40 -Secret = 2451aa0d4d3123d1e4df56f8f2b46971c63b49a7b555757445daaf35 -Salt = 14f45ccb8dd4160af196cdd8396e7ec01c2dbc58953e9b9ec4cc8543b53e0171c9d94f9d59a20e8d71116448f6b1314317945e33860fa97ca0af9950 -Output = 50f4b75e91a639f36372f933292206253b86862dd81bae3498c3b333caba7229ae78cd5a1a168d44 - -OutputLen = 40 -Secret = 14563d98dab6a65ae6d7e1c08f85ee1515d52139fba4699d3f9f7839 -Salt = 58496869b0f1ac0d91baeb41a1e91f49d34ebcd7b77f23b1082c9a5cf9b8c5760385af2d6946b613ac3b4c09e1dc41e8d6870fed25e2a589f32da1f6 -Output = a1f92973857a13da7fd6c1f64c87857e042ecec53fe1496270c770fdeaa7efeb77ee1e8242ae5e20 - -OutputLen = 40 -Secret = 6d4411ccfeca782ffc87ed9fc9163992d9e1cab24dea690b966b3231 -Salt = ee7967ddcaa6ddb242bbb2cee1fbf78632172d74f9bc0be645d52c19c7ee5b961ff6765432013372f693b7ca7f4489025fab6e599985c63e551e3733 -Output = 221bb18f086c7396b73ecb68b20ce8ef61739a6db97b2ab8a3396722a93be1c759855a95de86d469 - - -[SP800-108-Counter(SHA-256)] -OutputLen = 16 -Secret = dd1d91b7d90b2bd3138533ce92b272fbf8a369316aefe242e659cc0ae238afe0 -Salt = 01322b96b30acd197979444e468e1c5c6859bf1b1cf951b7e725303e237e46b864a145fab25e517b08f8683d0315bb2911d80a0e8aba17f3b413faac -Output = 10621342bfb0fd40046c0e29f2cfdbf0 - -OutputLen = 16 -Secret = 32c4003872a146194023eac1bda74ddf2b66977dad8a554b974ca2a62f7e4f43 -Salt = 33d8cf6d0c759fb622d867ea8cf1285de4020af81cc287addf38cc2da4643e6db3b215ad3e33bfc47877c3620e336887c3c9ad4a1c6c0476b0f90a33 -Output = f593af0e1a492a7b904a2662897fa1c1 - -OutputLen = 16 -Secret = 3c87e9cc98579b2749ff92c8b823a2ad6b367ac26622e7b5b80a2ce6f450e361 -Salt = 777d66a24c2d3cc3299ca0718f4f6dcd1161ecbef6eb3c71f0bc145b4e765a6eece807a74ca7a698d55b2eb0d30d8d3e5cd71fd2a02b5608274c95c3 -Output = ea6425f03803f2f06c42d8ba11ce4ee9 - -OutputLen = 16 -Secret = de1f4abfe78c4dd6f02331c057efa939ae2db1f1e7e7c650e07537d259b1ea72 -Salt = 4c1f00198d76f3630d3260f56d94f52507394f4a98cdc2937d4abaa76ebb3fd409a8769df074dc002917ef818a4852cf004f0225efc4663211a08c5d -Output = 74182ae81ee88c6a1634ff4991beb9ee - -OutputLen = 16 -Secret = 8c299beeaea05f445d59f5c354dbd0c8b4cd009f197a35369fb3b8612b75026b -Salt = 1a73fce114cb427dfaa6a699ab2751bf7136fa03d238da492d9a036143148334294d0bdbe4852c8ff37706bb27d722ddf909bc8bef91ac72e1841cad -Output = 16614f3e848515cbe526fd2b1b5a0bc3 - -OutputLen = 16 -Secret = fa1f4c6ca4268480527b37cc1635b69d4a07118f720c60bd13cedc867dfc2754 -Salt = 464516d6f8bb6589928849b984bea6dc3a45a3e3cbe9b27a95e94801c718901764d78910e72e5fe69860e76e8f2bbba9298676e8a86b3d63563b45a2 -Output = 67507b8fbc813d2387f69bc4d3bda44a - -OutputLen = 16 -Secret = ab12ca4709ca38350caf5602eee5218ec950353d19e65de9efc4dc2d19fe3017 -Salt = a8da5b25e4f292c149c88f9203c5370822193cdac135fbcd6b03f42300b8c372f68520dd3b525c79aa25f250b786e6de7f5d73b5fb46c987671c7f76 -Output = a7f44187d4ebe759b9a37e484a844e2b - -OutputLen = 16 -Secret = 12a9c4b3921b4ec2754e1cf093a38a98702acf0b8eb30f4bf654b8e3a10d3990 -Salt = c5170e6e67ccefebe8415ee2fb6429df37d6c2ee8fbdd6b970c3a98d486e8718c2202f7fc09fe438d53dfdaeeb0874ef0fd7b4dfa209cc9c5c512baa -Output = 9d1a3121760b17ea787e0f64c90bf109 - -OutputLen = 16 -Secret = 218b0f76980954cc381f2646636907e702078f7902a1894952966547ace91b19 -Salt = 16cb8bedb363b4795153a105c6049291f1978e7b2aab01ab64e29c9bb562418cf3ab4f1ee6111d5ed2e58ebe3ad9665588e0e4d9deae8524b5b79ed8 -Output = 80175fd5c9ca252c52bdcb5302de3db1 - -OutputLen = 16 -Secret = 3433f2c53824d6eebe11e11eb656da9740c5a342f5769df7fe17c4c4801132ca -Salt = 07e3f8ff03e6af5aad503cacb1db119d3178bbd3e2377888d6f5e6b7bf7b8f7c563a88aa8a778848f4dc01b29caf85a3b2307e3cdfe3de1e7043ddef -Output = ae81916cd3641c59897512649b657252 - -OutputLen = 32 -Secret = e204d6d466aad507ffaf6d6dab0a5b26152c9e21e764370464e360c8fbc765c6 -Salt = 7b03b98d9f94b899e591f3ef264b71b193fba7043c7e953cde23bc5384bc1a6293580115fae3495fd845dadbd02bd6455cf48d0f62b33e62364a3a80 -Output = 770dfab6a6a4a4bee0257ff335213f78d8287b4fd537d5c1fffa956910e7c779 - -OutputLen = 32 -Secret = aeeeca60f689a441b13b0cbcd441d82df0cf87dac236290dece8931df8d70317 -Salt = 588ec041e5733b7031212c5538efe4f6aafa4cda8b925d261f5a2688f007b3ac240ee12991e77b8cb8538678615966164a81872bd1cfcbfb39a4f450 -Output = 3e81d6113cee3c529ecedff89a6999ce25b618c15ee1d19d45cb376a1c8e2374 - -OutputLen = 32 -Secret = 95c8f76e11367eb55526a2b393ae906583d1cbdd47962146f506cc7cac12f464 -Salt = cad60e904b9e9c8bfeb4a81a7f67d3bddcc05e64255870403770f3533ae6dd634ceaa56c53e688bd137ae6018935f34b9fb084ea48e4c688f6bbb388 -Output = cafa5ca03f5fbe2a242004abcbd3de1059c7407b1ee579255124af189be0b556 - -OutputLen = 32 -Secret = 4d05391fd6fb1e292e78ab9619b1b72a7d63ee59d7435dd71897b9ff7ee7ae70 -Salt = f078e6f9b7f82d64554fa6b604c808f19b1f6ad6727db7aa6f1c86694e104b5256c8b4039919646481d7ea2452c72c17a3e8d7d3916285460aa5eb81 -Output = 6b16e8f53b831aa5e86bf97a5c4fa37d089bc172da5a1e7f662dd4a595339ab7 - -OutputLen = 32 -Secret = 0f68a82ff1671634cc9136c564a9e02a767621dd74a1bf5c24129b808214b752 -Salt = 648599809c2c4e7c6a5e6c449f0031ebf55c3661a895b44db0572ee88083b1f4b12602aa55fc1df150a65a6d6eeda0aa79a434a1039b91b5a58fc7f1 -Output = e297640f7768485d4a6e7cfe245f8bfa84700d99762692ea1a425ccc0275e8f5 - -OutputLen = 32 -Secret = 43eef6d824fd820405626ab9b6d79f1fd04e126ab8e17729e3afc7cb5af794f8 -Salt = 5e269b5a7bdedcc3e875e2725693a257fc60011af7dcd68a3358507fe29b0659ca66951daa05a15032033650bc58a27840f8fbe9f4088b9030738f68 -Output = f0a339ecbcae6add1afb27da3ba40a1320c6427a58afb9dc366b219b7eb29ecf - -OutputLen = 32 -Secret = e5f31d98a13f2390b354dba08e1e85116f99a56c2e8761d386958a0d0a888a29 -Salt = 02113f45151b63f374cfcdb1bede41cef2226a42b6c02c9f090f9f3db39d4e98a8258c42e27224279cd45c2501ca45a008d8f38915e5b45b8b995f5b -Output = 98e7a023092a3064050902c8b90c749d72005626e0296e1dfb28c10e450b2dd3 - -OutputLen = 32 -Secret = e6cfa4864d31fe09960fff968ac62f03b6f63b5a221cc95c3a1058b4b60fe9bc -Salt = 4670a7c2c8f5643b75ea4ceed87e253e58ffaa87472299160d35240753f3164c0820374b1f4bedb2dc34692c8b7e06c7951ee73f1645b10e3f272d17 -Output = 4f208e7306b076bf06133f439a6617a3d650253cf87775c3d6d7fede32139f4f - -OutputLen = 32 -Secret = 2f180b1a10445d3d29683b3facb856807689c6de54c760f6050c3329a4a1de4e -Salt = 4d48ca49a279a79bf9b3a9e346c3af74926fab6ad881027dee6a6f40dcf67add04efec4d86df31bbfc190d43e3a7aeea9babcebaead3b07b69dd3d6e -Output = 7765d245fdf143b6ca4359a2503ad1d8ea8caa7da8d556b1fe8e25c44c70dbe1 - -OutputLen = 32 -Secret = 2eb0a49fd3199a57264f746b1c8acbc76f7ce51223f72134590fbbeb3176264b -Salt = 980a908ed38b6e699df3f44e651f0ad3a9d209d3867c495e52673855d09e4f1a58fb477067c400cacca9ab9260e205c4556905f2727925561280639c -Output = 06d5adc2d5c517bf40406cc6bb56553b222f70abf2bb505584000e88628baf17 - -OutputLen = 20 -Secret = dc60338d884eecb72975c603c27b360605011756c697c4fc388f5176ef81efb1 -Salt = 44d7aa08feba26093c14979c122c2437c3117b63b78841cd10a4bc5ed55c56586ad8986d55307dca1d198edcffbc516a8fbe6152aa428cdd800c062d -Output = 29ac07dccf1f28d506cd623e6e3fc2fa255bd60b - -OutputLen = 20 -Secret = 7a7ecee4f04c1f5453f29b8c65bee909f673c44f65e8f9cc18c31c32e9bcfc5a -Salt = 0e2b53dd63008e0663962a25da9cd55fc2ea377148783da229ff7e3bd6142a43c854b6b5d06d87b535936f1edc7cd067e8dbba220a1f9a5932b32a64 -Output = 96fb8ef9380ac9de2711ef5a83249e608dc7bffc - -OutputLen = 20 -Secret = de71295dc50ac76eb5579410869e918b7be757afa606c509be4378bd98eda686 -Salt = 33ca974f8a1a065b75090c34c948449910495611e28ecc62ced29e5b3ae76217e139267041ba40be235de130438c1b14aa833296eb8e4babe2101010 -Output = 385d60538090a45a2b2544275905c4c16e9f23e2 - -OutputLen = 20 -Secret = 389de0b914661c8ac9aaf11d261f6261baf4652886cf20d2b13df67be2e3b185 -Salt = 92b3d47ea042591db5b531907e09a45a60a9c5c5fe0251806b7805b641c5b3ebcde14d6cb542b4cb242b04f5a9b60b2c66d1a24c66141fe0b818e93c -Output = b12a4e200180d20da404b44c952639a955dd83d0 - -OutputLen = 20 -Secret = 311af73874e13a8acad981490113934065b3bd5d448e2bb8dfa68b70c69d7d45 -Salt = ea20fc9d32cddc78dcbca2ead6c5c66744da85d95b643d3ffab2d0e2d5677dd3a27313153b019cfcd33b3e305ed66404042b2db0e3de2267cb557fd8 -Output = c6e86d1043333fb690ad23274a908204d6bcbbac - -OutputLen = 20 -Secret = 756f9980cbefea398350b886ca4c1b2910708b5b8154a0ec4b9648ac77b9d7dc -Salt = 3f09aa15d2fa769c6e8a3380bc55844827ba3ea64ccf177beb4bfbd5142b3963bf696803a89974aa7d5af0192cd525a83b71cd8ee7b0bc92f07b9515 -Output = e3bc62b38a7b3c7e7fcb9ef007aa4ad6a9bb519c - -OutputLen = 20 -Secret = ae815bfe220407bce6638f20aefa109b63c7382e91d7bb8b010ed7c6d8d3757d -Salt = a221f1a3623eca5f6385b57e7afe67d134011c6058e3977df977bdf0c7ab0e14b6d5c059f39948982912b047d00103dc4836e59b7a470222dbae72ca -Output = ed5e876d76227d0a7f1acf5ca08c812995303fb2 - -OutputLen = 20 -Secret = d5110c808a951c5fe36aa4852fbde7e0bc372a2c69a35acfc890cc9ff78e40fb -Salt = f45187072a7d78fe91282f5825daeb256a28a818c70a285262b080cd3ee2ec785125b27e4026ac9688a5eae657db578cd207956249f04a064870d677 -Output = 0e7de25fc559969c08d973ab40795df74e51965d - -OutputLen = 20 -Secret = 4aa25a61f8b31f061e0fc1d541deb20e097663cc57054e1f9a347989d8172d62 -Salt = e473fe5877fa137c50beadc2295187f1b66e35c80b7864bf01c1c620fc09893991500e9a93851ae122170911562bf6ee3c75d5ddeaded27814623d2c -Output = e235ff72d9c0a64a80cd86fdb26f1cd8740e2704 - -OutputLen = 20 -Secret = 26b29556106c06a85c6950aaf20b5e08a523e80e198a725b69e23fe93bd2e16d -Salt = bd973f9bc6ff0226b2acc682e0084b8c67b285ea9b8b838938d18f96de84521fe47d560337115f8232d765166751f1b7026e608d25ec6504346d106d -Output = e23b197d4d5fd8081ca54dd86a1d459cca7c69b0 - -OutputLen = 40 -Secret = c4bedbddb66493e7c7259a3bbbc25f8c7e0ca7fe284d92d431d9cd99a0d214ac -Salt = 1c69c54766791e315c2cc5c47ecd3ffab87d0d273dd920e70955814c220eacace6a5946542da3dfe24ff626b4897898cafb7db83bdff3c14fa46fd4b -Output = 1da47638d6c9c4d04d74d4640bbd42ab814d9e8cc22f4326695239f96b0693f12d0dd1152cf44430 - -OutputLen = 40 -Secret = 22256ca571d5c896db80a8758ff81cf8631d2bc38c7e76f3bafb0c2af540a356 -Salt = 9dd2dcd97b926251b50c6111d988e2951b02accc143702c88920cf36848f7c731756ab0537cb26e22725f11de069e5335802b0cb56c158dd75014791 -Output = a11aa3b1a93d2ce117550866c28d6974cf626719385b8868101a71a5d2aa793bc23c3cfdebe52ec9 - -OutputLen = 40 -Secret = 8066e057e73296158ed5479848317ad5e64ee8fb2e54d4ef85b7792f57f6f887 -Salt = 16da06e7360e4c27419b5f697e4c8548925ce55b53ad9e5e85b94c7f8e57ad142a1a0a0384337b1adf6410edcecea921152b94d6b23a192ce6f602d7 -Output = 6ebef64b358050edc3c841f52188c5e442cb69630fec0be5114816af616a333f0aac5153e9265aa6 - -OutputLen = 40 -Secret = 56f06cc0bc392ab108696c7df71495b5a5cd3638e0a92045af7cbd3076f6dd18 -Salt = 4fcae8f32b08b8fb746121a2db2bc99fbb24b9ff11c60a1dc91f14ad9a60c6bafe4adb4dc160e9901eeeeb212a147ee0a7e76d4aefa427f66a205c86 -Output = ccda8231fa5c0702ba282a8f18a0c1dec6baef308625fb8f504410522c3f3b6d647c177054317a07 - -OutputLen = 40 -Secret = 617f1b6810c551aa5c21878b00656351466069d41adc7fee1ced3f2f3432435c -Salt = 2113f7005c580b77060990c2a3f9e8c8825f0d7e93a3f69f208ebb5b97c488dabd0de7c7f00e08b4515db2c02e1824f96e71c9a21a18079c4b649d81 -Output = 0325b1c85f3d25ad5ebc2e7b380cfede6b3c8ada1af0d0d5bcd9d2b34c29083115168b8aef54c584 - -OutputLen = 40 -Secret = 659edb9a0df51a3867d4aa01f74f60b7b151b01a3437c2f774fd37b6881a9ca4 -Salt = 3fb60870a5813badfd7af948c3c924bec05c92d540140bf28f2546825c5fbd40f1571493a178467fda9793f2f7eed45b40ef68e0107b8d74c0cf32e4 -Output = 5c12c7b6ec38f516f72e76689c3106ee00ee8c2f50862cbf7fcb74bf8798eb761a33838788e276a3 - -OutputLen = 40 -Secret = 5703c556e3a53b8d2bf3c5ca773d0c6ed2c1b66a84e6680475a8286941b246b3 -Salt = 119e37d64b5ad702ca59f7952e5822cdafb723c0f92cd70338a17e24d3af6267af792b189a01a8a3353acd7a85b4d63bf7e4b22f73d7992e8e4e7389 -Output = e302c1c1e5c8f688a7580997399433fbaae499400b8a48901d808839c1eb49dfdf6324145f1ef01e - -OutputLen = 40 -Secret = 9a6e83b91bd999737e577e449142dae05968e774b223c1185dc574da785c93cc -Salt = 4b5845c6737202632b2946c3579d9d4582b475dfa373945b0abc68c8f0daa36520179439086c6809aa182094453bc0bffef0dc2888b96295fcd6e442 -Output = e90e3ed902a8eb1fc67823af534a2b48466bf2c5877dad0aadc7d6ff741d8f437b2e6d0031846960 - -OutputLen = 40 -Secret = 9bebf465003a85bc25ed340c6095d963885504d3cf0266af252effd22ad32d6f -Salt = 17506db459dca14840917dad23264303ab1c83e35018a72258099d20d4f8ab85c5227404b23aed6ae108bd1282e50a00d160e534264770a11b4fcc75 -Output = 1a32ea308aa6dc6f1b7c77f1d9aae40672fcae22438bbb0528e280073b31797886b6a80036a00e19 - -OutputLen = 40 -Secret = 1d9209183e557d3aac7e2ab53d26ec659df2a745fe56a53818ef5853a42ce194 -Salt = c01a431a32833930a22abee5c6ea34db459316def3b241529ece7e39e2069a1e6b942946132eebc9679801d2cefef4bbb6a1b84ef853325b7bc498fd -Output = dabcffa16a7589deee6c768aaf01e0813de909005526da54700083ef068f854d49941279689a1726 - - -[SP800-108-Counter(SHA-384)] -OutputLen = 16 -Secret = 216ed044769c4c3908188ece61601af8819c30f501d12995df608e06f5e0e607ab54f542ee2da41906dfdb4971f20f9d -Salt = 638e9506a2c7be69ea346b84629a010c0e225b7548f508162c89f29c1ddbfd70472c2b58e7dc8aa6a5b06602f1c8ed4948cda79c62708218e26ac0e2 -Output = d4b144bb40c7cabed13963d7d4318e72 - -OutputLen = 16 -Secret = 912141f04e2bcf79fe4bafe46f44dc9082ca39dcf964d9409c486139787467eac87095a8f2e2561c19d418ee6f3d836b -Salt = cba728c3cb42f62b9fde6598c8628e0f88f7639fd605b39d81296a0749f27c8b75830686deab949de1bbd0062e46524b1f30746c1cba02508fb4c29f -Output = 158b313c6d28b03b288ae2154eab2140 - -OutputLen = 16 -Secret = 43c80426677180bc073d093a809436e16d56082647ce17948765d560b6ccf0442129eb55341370768197badc754b095d -Salt = fd71974c9f2d40c04d62b73aedb6a380ab65e84712e7c7dc3c109ae30311f3ede77c7ece413dd5769fd74cbccb020c92f7b87c376205ff9490b689c3 -Output = e241e2c538fd0293de1d5f6e7cd56c7c - -OutputLen = 16 -Secret = 06f29a5d684a2eeb623532484a691ad85040d987248dc82c51d9b0b7e7be51847e9076e26fa7d33be6856207fe4ce035 -Salt = 56faffd4911601c217725fd816fe0c1a1fbd8f1553f20d8101422fc72058cab9c2e63a6266a726075cc31edc0a327fa4449b5ec981a86d9141932ab9 -Output = a2df03f0212038cb83ba468e9e05a502 - -OutputLen = 16 -Secret = fcf5db9ab3214fd36d9fb4247ab2a6f58862f1387917e585fa656fe0a19847b3c111fbee5a868092f224c79658ebdb52 -Salt = c792fc8b32a86c94212b5c845fc78a9a66d94ef98378e4d800b369f543f0a077fde0b6b109efb4c6bacfa1502249ddc1e39c7c56dfbe3b285d8e1970 -Output = b75b0c95ae60eacf7ed7b6a216c0a395 - -OutputLen = 16 -Secret = 4179a34cac89de053cc0e1557d41ba96c2aea4e35a0d304dfe2d4591dfd5deedce94ffc7ba6aba8b17dcda0e9cf8c420 -Salt = 3bfab95f22fc446e0e3682ee197f34db085ff24088fb6a26299878a309eae112ee32bf4882e218ad0a618b3062d685707e1261c15d62d14c5ce958d0 -Output = 49a25905c12ef9fece58c0a2861078c6 - -OutputLen = 16 -Secret = 816e498680e5cc39b8264709b508af653a50b927fcbdceff2ebe62ba3a25b79950268d3114ac49168c57c419fd77dc50 -Salt = 40486cb22cacddde870b727de81e11667ef92cb4f920ce7f2f80a0ef29add016142ce2694e866e1d631b5c1c13ba1e3fd0ddc9a16447c20186fac13b -Output = 79a867c0333d346f0df8ea2c6d4cb14b - -OutputLen = 16 -Secret = 6cfc570a4adcebccb8651c6db504e765364079ef34315c783546605ac48cc2aa933c6f10e824acc3c7338a09c01e1a30 -Salt = d5f8ee6de37e3d1a54c370bc2a80c88749a546857c60c6ee6df22f4f166be188bd2999870fa5fcc1d7cc455828f3446e6a450a14a667e715d3c16622 -Output = 7cf844677f8970285ad148e9904ab137 - -OutputLen = 16 -Secret = d6d454975edf1598fc5532c5c3d9fa0ecd357ea587b0601c90c7515729a84be28c0c9313a6ec757b8c2af5c17e994675 -Salt = 5c3edf4d856931d83f8939be9a245ef34638f406dee47aae5162a71f0f68c46c95cede46fa452a83d0691e7d06da9ab200fd5fb2f7c5f28c8a122c41 -Output = 0b14055cfb841a465259b80dc3e87d90 - -OutputLen = 16 -Secret = d62569c3669f1012c966f54ac5ac121d8a89871582347b13b208defd50cd3bc4908c9896257b10345bec2d40df2b6c5d -Salt = 918c0244a3a7870e3ae4f8c07628bb754a0f6f8a52137d549c7e9e17103b42a029688857185e608470953f787cc97a7ed75e7a3609eed2f3b1a20e39 -Output = 2dc4524aeccb5a21acf1f0b13053f5a5 - -OutputLen = 32 -Secret = 8fca201473433f2dc8f6ae51e48de1a5654ce687e711d2d65f0dc5da6fee9a6a3db9d8535d3e4455ab53d35850c88272 -Salt = 195bd88aa2d4211912334fe2fd9bd24522f7d9fb08e04747609bc34f2538089a9d28bbc70b2e1336c3643753cec6e5cd3f246caa915e3c3a6b94d3b6 -Output = f51ac86b0f462388d189ed0197ef99c2ff3a65816d8442e5ea304397b98dd11f - -OutputLen = 32 -Secret = 96c45dce79a02d2bfc2a10a8e744c974812e6a9b83474ce53743fcb334b87d826f411bad836de017790cfe07087f8b02 -Salt = 80698cd988e02b1bbb0d02c1bb2bdaf544ffdb3527ede621d2f2f5eab4a4964ef530378e94ae9ab7484d1eef854832d5bb204a8bff21651a9e3ce758 -Output = 8ef1e0fc26d3997f985ab5567066391c0d8ced54f1cdabce57b5accabe21ef78 - -OutputLen = 32 -Secret = 822c764a1b117085c10f0e689814d2bfbd9b43287f1a8c75d795a9831a286184c8586f3577b6e5bbce1637925e04fc47 -Salt = af346110b941b11d2189316c9fc2b9f4213775a5d7368d35412678a28fcd03b07f0549666efdf30c80f0ab5563720a56ef616a13bb8f7780036fc08e -Output = e0ae235cb82380527be76934a69622396d90e7bfa7e2d295e4375bcee0d1b101 - -OutputLen = 32 -Secret = 340e212d758e83cc5b89e4b56a86ee8c9631ae4e4bbaec15ac095ea4407bc7b634ad630dd0be85a91c08a8c7e1e1030b -Salt = 3cd5561ad12fadfce408e04180afcee38b83156b9e4be0779c4f0db9e26bfe5ccd43e15921977cd26b1db8288b80089eb7d1bbd7f59e1011b3e18b51 -Output = 05fa577b7081210e7c9de69db03d7c2026cf4469a90bfa29f1c2c10818d463e0 - -OutputLen = 32 -Secret = beb7dbde7e0a8acca2f3ebf8c37a1e9c318e447b9592f93fc9021e690888391a354810b9673e1e2400f05060d3aab851 -Salt = 560be29c62eca33855bd1cc70adfaf4e7eaba4fe55075d466e91467ac4f4b9beb678e1b2c961511ab12afa28d34a11cd2ee2b151609bc851036d1845 -Output = 63f96d3339e355487091287012d8d46280387567afb67517ac616d340fa36466 - -OutputLen = 32 -Secret = a360f0b516fc35a76d1d4a9ec6a08e856b8efa9310411398bf1ac69f28539300bc2256d76388e504c1f60c8b60e60698 -Salt = 0206faf5c9ac40eaaca9a1d16ac71f19e2de844db2e73e4fb7e34567e221d5acbc6931412745dcb0b05e119284d21c4bb3f9a939271750f68784fd9d -Output = 88ecee742a071f9d24720520e8bdbfe140ce57e7fe2b686966871eed0a6165eb - -OutputLen = 32 -Secret = dc875b2f393c1d40c241261b0918790601c8b908608448f766e6e8aecfa5e4927e7574af4030047d98b11468108288e3 -Salt = c63ae3b995afee4ac3154bf9efc6bb10e537736ab5bc427f3c376be8fb81aa5e0764a4b0165eaab0a519ecff45e6f6c769ea664bdd6935c94d8acec2 -Output = 473dc6a980d6e2465bfa3d02e7e5341b9cea5e09f27767a5c58f7db60b5f744b - -OutputLen = 32 -Secret = 49db7631a3507f02d6b9048e26afce48b05e91b50fec3b7ccf2e8bde9aa9d79c0b6673f814d8ce39795e79239cbc3967 -Salt = c9083a35299b25141cdc60b4cc7c24263693f15e7af1a8c6d121d798fe0b9948a83338dc2cbdc75876efc83fd3398ca0df223b105b0f13ec2033bad4 -Output = b350425347979c6f1c100db1f6de919100ff713765c1dea146c62a69896235a6 - -OutputLen = 32 -Secret = e2168ab072c12da471fc024fcbc52778e9bd68f44762b9d8baab746db9c14ffe7181f71c2ee6488130832830fd0bd5f0 -Salt = 59569454b2f5424a914a2d166da8ee127b0ec5ab4788b115c1d9966a5297181c64549073229a32e5de40c94a8f9efe71a0c968f6330482876e37bedd -Output = 16cb6bc93d9a001460b83259bc9a4344d4b4cb422c6102565dc5b190de1c5673 - -OutputLen = 32 -Secret = 00a12d3ce4ff75a6e30f41f3557c826af1326b6302f4ce887bad3d3317a548c8c03a057284dcc38d8bc690bd4a565f47 -Salt = 24c5c0b2c810dfa08e35d7feebb8c78e0cd726c92ecd42d9171013738ca2531a947f523c37f64cdb04305bd969d1d6f9ecd46405d28280f968500ba7 -Output = aef3d57c8da7d9582c5d1c62d6b64896da9b1b0e4012a44cdc3dcf4b70ad6c66 - -OutputLen = 20 -Secret = bc3157b8932e88d1b1cf8e4622137010a242d3527b1d23d6d9c0db9cc9edfc20e5135de823977bf4defafae44d6cdab6 -Salt = b42a8e43cc2d4e5c69ee5e4f6b19ff6b8071d26bab4dfe45650b92b1f47652d25162d4b61441d8448c54918ae568ae2fb53091c624dbfffacee51d88 -Output = 91314bdf542162031643247d6507838eaba50f1a - -OutputLen = 20 -Secret = 23d5f3f34c9fe733e808949f4011ba3171376e3bee807ec5b28496bf4eb51d85aa37c42e1ed93cffbab96c6dca3afb3b -Salt = 6ec7b6bbd81a312ff787dc6af7c7c7b9cdbb7d0c19d808536bc0990bd7e79e232bbc1433ca567cbcc4daf79e8d7224c30124a639852587e2715ae62e -Output = c3c3579cd70af7f8c184c580224f27f7664c9fd3 - -OutputLen = 20 -Secret = 0000d9b7ec6fbefdf256fd68220b5205ac65a2001145118c50ba6b657032198b8b7ce3b2f7068a780dc17c22459af2b7 -Salt = d857541c62b85756dc73de7dc2d86f5d5e8b28338bb0a945b5c4fd7c81f71961b9705d3d153b19195d003b74212068ed10f96c53438653087a0152cf -Output = 793ef113f96397ab0031eaa0faa777c107e7d03c - -OutputLen = 20 -Secret = 4f3d744d3e449e0627bf4498743828f86e638f60620a7ed4a7c9b5b073691c9ec94728c58822e827f0f6ccf86dbc1cae -Salt = 301feeb25e6ca8503ecd821f1d3787aebfb3d0ec518bb31174f5209b2ac1f28ed3e698736bad10a18e3cbdb5dc27bbd12d058b36db0892f9cfd08300 -Output = 85ef9505b230565eccf2a64ab3de53e5a91c7b51 - -OutputLen = 20 -Secret = 6af3e1659ee7caf1d10ad9135c9757350f69886ccab1ba4fde50c4614b319e2b20ecc7636c5f6bbae71cd35565a4a2c8 -Salt = 79bac447f12fbe96c197963b91b939ac3dbf4541bedebb22c5677f54b377a0cc3b55a2bf4033d422401a149e74a81615472d0d4f8e4f0ce54384d844 -Output = 28abec20d6f092d09e32360986359303753cedbe - -OutputLen = 20 -Secret = 0299d1f064352d5a83fb61e1e050980f65b4b440819d2c1c29b6ad5bdfb2c00347da993cc9ec00fcc4bd01c03fed9b65 -Salt = 6f9ee5cb3852eec2ac3f095c25c20363d0f7f4770899bf99187e2a830c6571aff821ceb7e80b6c744f8c5e7bc0b2b8196fb540002b8db7bc60913998 -Output = 293e0fd3e4d06efe9ee1ba7d8bab1d36bd7509c1 - -OutputLen = 20 -Secret = 1edc7fe9ad33a7f6f12f350c128e2893ec1be59c0a77fa5896f2e276bf9eb19ce5b1c1cc2ff25f9391da304d26037be3 -Salt = fe3483540341174fadd6bfa9f96473eabd964ad588ae1460739deb3bf512475c6d57e017dc46e1115733dd81fa6a5daa9c1f9d23c0afbbb36958cdac -Output = 3c192347ce7313e9e54291c37c412cf90af58a65 - -OutputLen = 20 -Secret = 27a9a514e63943e9b90cad1291fb2a3054c85b4a745cc3cf31bdc1c8935d153fb495e7ba4ab641b7c9e3b5a7c497b1ca -Salt = c5af66ce6c03fb7fd88017b38149a32c8c9dcab96665efad28deb71b61ee75887e1324800b01b13fdd5db00b8bb4be50cc2eaeea43cf26e77de6dcb3 -Output = 886db74207de3b034f3e70cf9b47324d57df5185 - -OutputLen = 20 -Secret = e358bb04a5aaed97939ae415ab3ffe9d2ab14c86c3c3f72b285bfdfb7c1440f80d75ccf28d2c64d503426f552cb4fdba -Salt = 6b93add9163f5e14df0160b0ee0402b3542f920fb12cba71c2c7988877be46be951113dabf48aff27e8c9b214cbf293b8a966d2ea7ff515b6bdaa8e1 -Output = 48bc1bc135d5ce4ac04b11e7c50cdbbf84c44ed7 - -OutputLen = 20 -Secret = 6e3ab74222caa37f732de378992ba75c37b1c14b3f5a2c2bb42c270d6f213eebad3c3524a4b354f753bce5ed7ca865db -Salt = 79d39097b19bc6172adb445cf9418979b943825228307f2f3aa8a591e0331c77ba01aedca2c094390c04694dac907be1ed20c124c0c1e5b278f63a3c -Output = 629354fadafb077d7344f524b82b7d14a5ceab22 - -OutputLen = 40 -Secret = 582f968a54b8797b9ea8c655b42e397adb73d773b1984b1e1c429cd597b8015d2f91d59e4136a9d523bf6491a4733c7a -Salt = e6d3c193eff34e34f8b7b00e66565aeb01f63206bb27e27aa281592afc06ae1ec5b7eb97a39684ce773d7c3528f2667c1f5d428406e78ce4cf39f652 -Output = 691726c111e5030b5f9657069107861ecc18bc5835a814c3d2e5092c901cb1fb6c1a7cd3eb0be2a7 - -OutputLen = 40 -Secret = bda32ebf6b8d6c21b4078c05582ccac57d0e09d598ed51ca808bbae4315ff3082086e772a50f828ba3a8a47089604c1f -Salt = 723a6aa3e2093f2b3a377e4d716cfadef784eb38d10302a8bc88294ffab02e8ab43e6c83a70489dc91a4040e1c04f711a9adf601d49a2ad07835c668 -Output = 92eba10440a0f28eca40c765cc08031bfbaec5fa2a2d3fa19069cb3d5dd08e01702cd5ee16328d0f - -OutputLen = 40 -Secret = bc8d610533e7fd81f3f6ac2f93876be259e88c6f234abd0880762d12cd7d2134f252becc395cc48b88eb645d722514c7 -Salt = 29a5ea0dc26206268095791a2c0b1819079c88f85dd0259bc8ea74d6bf504ffc21c6cd5f92f74a02283de4e33945393e64ca4b0f691885e4f2762e27 -Output = 6e3a1b6233d8e08a1cfe49c9f9e8605fa366f61080c5f1a750b22113168d36001daac6d7bb8c99d4 - -OutputLen = 40 -Secret = d6be75028f7bd73620667ea50c4a674471854b677ff0b63026460c3000d11b5210029f2979b3eeaa613812983e7d7693 -Salt = 5c2ce248c0a73a29a6e8e7b3fdbbaf0198d636e6d9d6a547685c27134d80411d122f96311434798cb19b3d446f52d7d1d74bf3ee3fd1fea2a3b526ce -Output = e67c995da49f4ed0f6efc09f839c795e8447e17790f9805aa8a93a4db9a03970c280e9159a64fec3 - -OutputLen = 40 -Secret = f7678cc0b7aec5f4bde487f30a5a88c988fd24c463b9e46b3b2ae4c765ca79c48abe691cf93b6b435b2bdff2a3d491f2 -Salt = b04c945bf149f2f6d17438958d1a725c3a8ab46caa15a05e809524b9d1777efb48e7d6baaf5d3efbf30b69b326935e59411207b913f38988e06abe5d -Output = 65e303ade8d5ed5559c40e6312b10ee4f2f4ddee166127547ff1a14cc0318cdc61d1d0c3d6542ad9 - -OutputLen = 40 -Secret = d5d78eebd12f82f398235ca72af4277db475a80da843f36e1ed95a661e1e610a2c7dcc433e60029c6689980961f3590f -Salt = 094c5d7c7457c51c877a0bea03fbc44165c10635a4e64b8556c8ecf20914e621ef34224496489d76f67b2639608820ada74137916bfb315bd50872ed -Output = a16e9ec1be1ae3b40aa906c8e18e9a7697cc34124b7b04957ce149bc39bdf27016f5839e21ea7976 - -OutputLen = 40 -Secret = 58f1a4c16cb332631b217a8e1b5cca843665064cc61c9e82ae4180d574def4e2a3ab9403036e3915d95044997f1bab81 -Salt = c77a0bc9543841dc062c8abb804978a3af7192244aac4f73a821750ba38d486d5a2b4f8d927f830772c4e5208e91c37f82b7c658d240e14e20d58cee -Output = b2d075292489bbd177f72e5e800618d04a30f9b6e0a8d1fccb438ae6f646a33e0c47d3625ab87b6c - -OutputLen = 40 -Secret = aab0e07e2845ce1664057aa15a1d50c35ce85591c5e0d8d3aa7e8c5a58b0bf56c270957f3728c9745a4bc696f87ca0f1 -Salt = 3c115bffc26d419182433bd43570fb3f6f2ffe37855a5546dbc542990fef1e332c3a070743ba31e984ca18cc94e33f4f2c744f6b70234a7ba80d7e4a -Output = 001cda059179acd067bc9129017d24e8b99a2d6604e14714f720358bf7f43cbb6a4aad4623267e72 - -OutputLen = 40 -Secret = 0c5620f34aa7029f655a9eb9b051f13251d65bdf99d390b8f67898eb2216ec10bacb29358b895529db64fbfc942fd0ff -Salt = 6d8b8cdf7b699c0205c6feb4ac1839d3c436cf962f8575ee67ff20d69103c4aa93bb369d360980181e38c44215065c99a066946733ede23185183617 -Output = 2857c7b4221a02b6717a1c67b1eeb64dcda8162284faae88466414b317e45457b5aaef5b5089722f - -OutputLen = 40 -Secret = b57dc52354afee11edb4c9052a528344348b2c6b6c39f32133ed3bb72035a4ab55d6648c1529ef7a9170fec9ef26a81e -Salt = 17e641909dedfee4968bb95d7f770e4557ca347a46614cb371423f0d91df3b58b536ed54531fd2a2eb0b8b2a1634c23c88fad9706c45db4411a23b89 -Output = 5949acf9635a77297928c1e155d43a4e4bca61b1369a5ef50530888550ba270e26be4a421cdf80b7 - -[SP800-108-Counter(SHA-512)] -OutputLen = 16 -Secret = dd5dbd45593ee2ac139748e7645b450f223d2ff297b73fd71cbcebe71d41653c950b88500de5322d99ef18dfdd30428294c4b3094f4c954334e593bd982ec614 -Salt = b50b0c963c6b3034b8cf19cd3f5c4ebe4f4985af0c03e575db62e6fdf1ecfe4f28b95d7ce16df85843246e1557ce95bb26cc9a21974bbd2eb69e8355 -Output = e5993bf9bd2aa1c45746042e12598155 - -OutputLen = 16 -Secret = 6024bdc82440473baf798653bcb846f8503d73b6edf5cebc116374538b6256ac8a8ad5fa8c7fad7b3f089933b9c7326d6b80572635c9f5f6b38643971d075b9f -Salt = 1472a96bc81881767f6154b2bb79f4da8578d447ac495d7ede31454834be3d643034b2e16034ba877a846e6e6e22b284b6d894395f33b4bea5f1cd7b -Output = acbd761e976576b189696d26e745a680 - -OutputLen = 16 -Secret = 6c7d94622a2d1c4394768a39cc340c6887e06c4a88d57aa7822f0f2b3fac0192e851f7dd39cbefe6ccd70992e27edea4729b215ca2dacb05373a411600233cca -Salt = 52d1ee8b4c0aec771e236e86928b4e943cec53401848b8a353fb2dc0c74d9cff74e8086ef5542e3f210209ff614d1fd3177b5df4dbf89978d1abdbaa -Output = f3048aeae11b116a234659d40711267d - -OutputLen = 16 -Secret = e0630545ebdc440f373d194fc6c4629a62aef028db52a3fadcd32da24c2ff79106d349afd8500d6b4ffbfe2a9d59803fb90f25b60fd029c3b67c21dc070d852f -Salt = 1821cb3b1cde82beb76e55cac866e3bbf7eb541e0aa66c3dfbe509ea7870670745acd5451d775464aed2d66e5cc4360c6b7b75b35a3820cec217a086 -Output = 90fbfa27119450acc8e6d74b03b05558 - -OutputLen = 16 -Secret = 7b3088f0fe86a0c71cc02660e3ab04d3789500ab9551dd59f030847dda0e14dda8d6a2051379d0f591269c3dff303cbfa08424f421913b3bf9c3c076012ad8fc -Salt = 8524fd3e73eb9476513e31005d29dfe6927d877b74734edd8c2b886ffd3f053000d28344ee9fd9340b448c29fb1725657b314db93c639f98d756cd9d -Output = 5122a61add589993111739f4643ee406 - -OutputLen = 16 -Secret = f4ee35d1575d273ce42a66d6a6e521e87fad64bf81c99f5773b60c0a9fe2d4d97c52e6e0c1775b4ef7e41e92a1bd32eabf3fbadb93f6a0b3e7324b7da043d6c9 -Salt = 92364f044e0d64a8fb4c53cb1b73a665aaf66ffc9ddf4152ae9da35b470256b00b50234e26c3149f1c380dd93e75accaccd167e1d60a8a06d31bb2e8 -Output = e2b4cb180ab6730bb0c16178b20548b6 - -OutputLen = 16 -Secret = db3db876166713a7052a9954f2d37ef35e446368cf84ce5c315b4f59ac00d0d9eb22b119d040bab5f25f224a24d94901015a2223856203dad2260164ece61935 -Salt = 77d5afc143648a249b17af10d688188a780542db7f2e3d4265d16e4fc94cdab158c5afb9c70af2d1668a008aad4ada64a9dbfa97b439002e4bd3dbf6 -Output = b01c96baf28ca5841cb6e4e0cae30d59 - -OutputLen = 16 -Secret = 7c977b74cdf87721a37c6f5e9d7c91d1e11744514d51a68d12d1837d26b79611e86a05a4685dbee8eb0b30962b19b96f373f5abe92ff0235a4ae7c35380794a5 -Salt = 8da372e4d534416d9c4fecf9d22dc576f889bc6f27453ca75458ccd8f88a8600ba03d4d19480d2ef899dc72df0732fcee8ed997fea4f2d526bec44f3 -Output = b22db6ac3a88aa1aa093c0fe55e2639f - -OutputLen = 16 -Secret = 6e6ed01ff12d3251396bf56062b1b3c79b55b4373c0331b14aa593a3ee005b5f068f0efc56026fc72d66f2744dd1f168f247912f9b26ebc59463b96bd9f1a1a1 -Salt = 5eca796bef031b87521ed0904bf1d855589749b0183e993d99f741619b62644fa686a4c90f7f1e6ed5344eb75880724c09b751617c31fa5549828a25 -Output = b03b235f5af9719f35f215c2f94a76a5 - -OutputLen = 16 -Secret = f4cd4f279a128c74e5eb821472098204ed96ed61eac9281bcd53fde6890a2cbb1cdb97e0e343fc8588b932cd701af88f0a7af723d5c0850e3e01e47612fcec83 -Salt = ef470dfcd57359f558354f845fc8ca3a1a67419a6d0f6dd698c78f9a57e820c3d8786f3c589f9693b8f3fb3e123a482386c1c0cfe26bc5322e90fd4b -Output = faa720299513b73de2b54896d9a06bcc - -OutputLen = 32 -Secret = 5be2bf7f5e2527e15fe65cde4507d98ba55457006867de9e4f36645bcff4ca38754f92898b1c5544718102593b8c26d45d1fceaea27d97ede9de8b9ebfe88093 -Salt = 004b13c1f628cb7a00d9498937bf437b71fe196cc916c47d298fa296c6b86188073543bbc66b7535eb17b5cf43c37944b6ca1225298a9e563413e5bb -Output = cee0c11be2d8110b808f738523e718447d785878bbb783fb081a055160590072 - -OutputLen = 32 -Secret = b0b5599c29cce7644372b278a3275f3e0723739f42bc03fc9a4aca09d9cecf9afdc30393dd1cf7499236239608a258f5c48e66b663f6521049a482b63d468a33 -Salt = f00101f38e5d6098cfea4c7c8490eb5505390000478a645e6621b1f711105bdb4820dc0c783bf980c062899b70875e17cc9116f2fa588a942405bbd6 -Output = 768796179ca511b841717887810f870fa3c12641c95ecdcea8590d730ea43b8e - -OutputLen = 32 -Secret = 52bec703dec94b80ed2f8449c752ee4b8b8b1b80e55b6b0e1e9db1770dadfbb2631df554d1ba41bbbd0e587369ac81b40ba6d941fb62dba78a76b554eb03c643 -Salt = 9f51256b1896925866f22053348ef6e8a52ec580b1f32beb2574afd23a5460c30e8c811d0e7a2887bd5cc0653ec8d68dcca43f71a8df1f0193205b75 -Output = b19ac7d4efde7c62191ea76530d30dfa5510cc74bafacaea5cbe2ced467fa1a5 - -OutputLen = 32 -Secret = 8c472849c12153d5a47360eed0438689d056c08496d285a179297a93dff50070fd3c2c2d88f1c4a25b77c1a5efb47bb8f881c89f24d464bc23c4f200291d6251 -Salt = f2d317f020b212066ef7c869c9c56699c1d4dfdb74cf679b97d718e701e442b117a6d1162bf825ef491fa628eb249a1ce28018b8a5bd0b1b296e4d92 -Output = ff82b4d0fc9e17c0539fa2fe66f2e1a07b7b593a1342cd0b48162fda68b7d80a - -OutputLen = 32 -Secret = 104280c86c79879e96cf15de96412492fff5d4dbfc677f7d384c09a4bcee160fa3c972969d12f9b1542d570baaebbd801f632e172a8a00477edc06f938eae198 -Salt = adf1f167939087d71fe8d9ddd2c903c542775129dab2edc2446cb394a808ba49cf4710ea10cb72a4efe8f1a32c03d14660f10b0aa9255bd0ee865c10 -Output = 5ced814230d7f07da116d7930b4db6b18b391bb869d15196677bd1d17f2f8c7c - -OutputLen = 32 -Secret = da48986b8c84d0f6b2d6ba9f2c02a53ed8f173b238dd8f3020e15eae425871cff148f15bb0ba17c2ae00f44b2c14725a7b130505469bc0706b699e2d901ad16b -Salt = 08528600237b6d049268b7bf3e2fcd9373a6b2f6732ec89437ef8e134fb947c3f37f254c7041d3f06f789953baced415e9d1dc400fb0025be180425b -Output = 50eb29e9cd5ca7730fa565870b23a40db75b5e051b35850c98fc9613a251bdcb - -OutputLen = 32 -Secret = 195e31b3db4630a9e66cde347716f50227f8a81c397a72e30d27aac27f8b9f2f2b453e68fabc9d209d443d952263db0c341c866d966eb4db8f8acf8eafe7a227 -Salt = 2b281526345351d797be0a7dbc517bb9c9c220b5194cec3847f6fac4ab1030867d1851cb8d46561db605506567dc2f39dddbf471e4a7d51b23745592 -Output = aeff884dcbdc002a5f7a877a34f73b42abad2089d4e39b721eb370b3d87627f4 - -OutputLen = 32 -Secret = 7a1f12a3fad7e0d3e244fc7bd3f0917e47bc76c60285ded739ddf9462c160cdfcca887866d6daefbf12e7410fb1b50ad6c8b21b6e56877f47e8b14a0ac9f936d -Salt = 77097024c944e349f0ca2a579cf51353f50664ddb4bbbdbbe01dfde80595daa5d043d9db9651fb821cc9acd72fa91b2ee93e23efb39409711f3915d0 -Output = d2191b6aacc7668038d762c0cd5915bf68e490671ec4032c20297a64026fe042 - -OutputLen = 32 -Secret = 7a41dfe8d0c9ac924a2accd615ad3c0bc0d7e124fed6b2b7e05b9f8e6ade0678e98d45766f9697cd187bc10321195fa1bb84b55bf94bb112d73c6abb857f40a1 -Salt = e47aa81af8d1074c8f7fbcb589727ec225163d076d4e8cefc827c78eba7b42d5e70377d7033dfdf5edd93f605dd9b25d75548518e405563d1d4bf313 -Output = 5dbf1d3dc128e67f2452aba858b7ecfb87efbe66b714541c0d4c009c2b92d7f9 - -OutputLen = 32 -Secret = b27be323ee094400fc9dacaeee0365e0c0c52811a6081551dd46dd86302c6396fce80bb60e306c9785bea1270356a1c2b4db7634d5c04891e85417fb72cdfab2 -Salt = 6eedea4c7c2ad22289c4e66a96e7a7a1cae7d340fae412a6e77697c2081a27560a9f0cb0e412297f99103a233a7998650590c5a7e2861738bed7c9fd -Output = d0656230b86e4dc3ea2bdb8d62b452262462eed61229d1e2b92758b57c54c434 - -OutputLen = 20 -Secret = 9dd03864a31aa4156ca7a12000f541680ce0a5f4775eef1088ac13368200b447a78d0bf14416a1d583c54b0f11200ff4a8983dd775ce9c0302d262483e300ae6 -Salt = 037369f142d669fca9e87e9f37ae8f2c8d506b753fdfe8a3b72f75cac1c50fa1f8620883b8dcb8dcc67adcc95e70aa624adb9fe1b2cb396692b0d2e8 -Output = 96e8d1bc01dc95c0bf42c3c38fc54c090373ced4 - -OutputLen = 20 -Secret = 6ac19b36af7d0e5c65f58dda2ff76c68567cd8ac16ff2463fc3c8654de45a05e39c75d83758351753d2e143629ab9075738b037a1ef41f7efd70f1e700f7f67b -Salt = 4ba9f9e8e33b40f4390333f597ab565b27a841d5fac930f67101e65973f071ac6ba3941c9d22f40ca44e91657a629b7f56980e0eccaecb943b16ee27 -Output = 3e43b70633884480ddd93d6f20ba512b55590b68 - -OutputLen = 20 -Secret = 2ece7bc9eb5249f5179f2528a062d0dc30496604bb76f26e160d3633140fc6edac717eb5402d0fce56b76b7cfb0aaf47b6afc410fe06efb049fa28953d7e4942 -Salt = 1ee1efe3ae248819c5b33deb7869c3540cd8abb7dd522c5f0ab71618159cd0d23dd805f14ee27e012240cff85f57c72f88d5ef6e2196eede8cf7b786 -Output = 2df4fa52d2858700085570901f5f857314e1e02d - -OutputLen = 20 -Secret = 283e37fe181516de2bfb14e6291edb91dbde4a7b1475352acc47efdf244a2ba2e639d9b028c02dfebf51dd2d37c4da64aa89e6a64916d58f1c80b25cc080a950 -Salt = 578cfe1a70f52f7e456a22f1485ba23830e3dcb05700ed2812cadc181d448f1119fecd8fcb49667309cf0e316470590ed93baf567f469def5dafc3b1 -Output = 24719cb6f6b10e2eb586a0e167f5683df2113771 - -OutputLen = 20 -Secret = 4a66d41ebcb184c3148a0debd67af5c8ece3e6a1c13c413789796a99a1ed24ada2f5107c91159306fe8f68c245499fbfd8f85009a100c8535d22dc71df09f74f -Salt = 40eaf429f7dee6f5c91f2351ba51e53cf6f7f836398dbcc33381b4ea4046a5f2cd545c932e58027a1e724fcf8552cc79abbceded385a524648c1dae4 -Output = 8f1bdcb99af0fc510ad4825efdd750d3cab7846f - -OutputLen = 20 -Secret = 95a53b3f953ab90d4f85e7e8437325be1a0235a89311fa1c7405c3c0bc61f14ef6e7cad32165aeea2ad718bef144d66302e989e2f1a323e512780d28b6da74ac -Salt = 37495216c113efd2ccaef3583a87b067d65c165dbacea9e04ee34411eaa6616fce5348abbd121186f29e071c467b60d9291ca2eb664ebc2a7ee50eab -Output = 71a5b1eab411afba65081d4d0471d532bf0ec65f - -OutputLen = 20 -Secret = fc3ef290a89b79e95de83326b34242778fd2d542457365e2719d328fa5581401ebfe6e2655da070aa3e26b363b595e1af7babd17075dbef1775cf6157d3c716b -Salt = 592e1984bdfb4bf18de83a6b19cdb63f27b10985e7ca520b71ec392ce09e1d2da14c632553574b876752b9d572ecf41bc5afd057be99d8019e19f7e8 -Output = 083cd3b0b564ee7c5e927f32d10190749715b21c - -OutputLen = 20 -Secret = 388b8c9bb988e762ede3cc072bd88ba7294785afb0d6506c2357a5e23331a51e968f7bf50576ef9e64b69b4f48d6e509639ce9693e3f2094fa33b97963e1cc6e -Salt = 5b8fe0c658c0fd7698234c477860531221a7f48617e4405d5c8e8d3550f105b78469a449cc2b855d4a5357c1c612234b2ae2b820f07487b094ac7c3f -Output = 735102b59b09d06d3e6c9494433cb03f5b8ca383 - -OutputLen = 20 -Secret = f1e39d9d0984641f24702f8b37fbf9a8fafbd17fc23569e940c31384cda58c0274b167b1afc9ff44473d20d6a23c922502e31b3dad13274b22024ff4eaed668e -Salt = c880707804a76450019632c32f037f97ff2ce7fb1541a9adbc092d96122cde19d5fe81cd12a60f491c5877b601e4ecbe0fbaeb67b446c4bb2a9ed60e -Output = 5440c3450ac332d0a8f5c724647962ac82f659e1 - -OutputLen = 20 -Secret = 9e0a79b1d6c672d3235464cb2be6a36d02c982387def7e2fe32a5d2be7343fdc038af48fb941972facc8e33d6286e142852dc4cf2667a3c97dd557bc6fc66e98 -Salt = cd356d14e32bf958c17711d26a30412088a2e214e600e692ed4966212565ea891c807e1e0bdec0a9dbc71f502f09975fce910c7723db4df380e7ffb2 -Output = f46693300bc3bf106d6a8566481fb12b45ee1f95 - -OutputLen = 40 -Secret = a9f4a2c5af839867f5db5a1e520ab3cca72a166ca60de512fd7fe7e64cf94f92cf1d8b636175f293e003275e021018c3f0ede495997a505ec9a2afeb0495be57 -Salt = 8e9db3335779db688bcfe096668d9c3bc64e193e3529c430e68d09d56c837dd6c0f94678f121a68ee1feea4735da85a49d34a5290aa39f7b40de435f -Output = 6db880daac98b078ee389a2164252ded61322d661e2b49247ea921e544675d8f17af2bf66dd40d81 - -OutputLen = 40 -Secret = 244356be9b327964732eb4a7c09b04b420712396eb57f72bc94924066c687e878e798e0a033a1ee1a4d8cdc2da0443ecd77401d0460cd906eaab02656c1edc98 -Salt = d806e2df8c85d3baf5d67e9c97b746ee6bbb1bc10dcdf6c7a6075c311cf34752acbe60e68f23c7f890b5ea7300a1ad32178254885246f0493987a6e8 -Output = f0b5bc749eb300ca217ca82fdffed89b1bf2c8afc2b36ee2b48695e5085b893a6daad5474f74ef0f - -OutputLen = 40 -Secret = f5567a2dd9236a99200c4bd5390743e2560bab4b196e3c732b01abf900c7649cab5b957da6ae8fd025605147b36572c19f103670b16f6bb57c138754479ad45d -Salt = a8ccd4bd36fb0ed0765e9662f1028d600bd650e4c2cdddf94b27ee881120aaf74b727b02f0036b46162062e39ed43fa85687a58d177af6f566811889 -Output = 2e55b73d126db0f92810266c92e4dc7a7f2d32cbed9eb4edab519e5cc9138c642fd4b229780c17bf - -OutputLen = 40 -Secret = 46a65f2e432fe2aab26de24d1b9d39b44da270230f17844d44e249565a125f87a070b4b2eeac0b3a6c54acfc49ddc6360f59fe0e330e0605c61e85c5c27fe756 -Salt = b06a23e05945f96a293de59dc3db5972ca1fa00b4647ac38f753790335d5daeb2ffe09cf8924ac4e80b275ea4dbec53b9e2aaf90df0e6fd82ad69f7c -Output = 04bbc4f93fb5c3589690798bf793c10bb726f87a4a2de93b8fdf6be8015abe156577119c5637ae71 - -OutputLen = 40 -Secret = 8d371552164bcee60771e876ce546c4b0277b978e0963e2312666fed5faaf340a55e00644cb36474464a4c2775f480d88e2d3b41f31e0706209eb8e51595b92e -Salt = f570212db2d3f314afae51f83875e4da7dbc13073ece83a6727e011dd0f748f569714b59f44930067b8962b83289b441ba65b0e2237aada36800f955 -Output = 9565b54259fc5c61a7f7448e6bdfbe48191c2dd6ca61ce35eaf3717ffbfe1c467b3de080faeeb8b4 - -OutputLen = 40 -Secret = 07f8e73d47de5f0ee2ccf871c702a92a1fd15a4de130611e46a4247a0497465b3fb5d785c01ed1cf061c73fe1f55dfe0111ec735d376bb39ac6cf83d7a2371c4 -Salt = c13aadc44d9c3a209b9081b19be6556c9fe7b491e0b8d98b18ac82c6b4dc3e8ee23b82db2babc27f055979511895e296b6d9f7dda35a0e265fb3c645 -Output = 9e222ebcd27c7ca72179121c6c60fb0daae910620ca7b01a8d0154d48da9c7d7aa9a5667375ff518 - -OutputLen = 40 -Secret = 5f00b6755ed8c9d3ea8cecdd8c17ca3afedd25871d1c50b302c1fc864d04147382313e6a701d9b6cc3de791fa65a782bc0d74097361b12a5b45408f1172dfea5 -Salt = 5669569b911167e8f9c6b1a83fde57b6db4171aeb7657aa94d87d542bd9d4e89f69c89e0fb4b3d3502702327fbfe653af60a7fe1ab600e2620d765a6 -Output = d937822ef92073cfcdb5d8db801a3875e45fe34d316f40ee57140e1153e4d28251d0a05a9f49ea66 - -OutputLen = 40 -Secret = be755ab76ffd8f2eb3f246e036bcc06df39e83a471f468c29ea8bceff47d28222637c1cacf2fdbd233545cc888474a7b2131ccc735225027c517c48420d10acc -Salt = 4e39d12bb306f5d1e1859484215048ce6ff0033b3199cf1732d0088c4187d49884fe30571243b2a643bc56d4986dda958ed5c279bf7a9be2e37567e3 -Output = 302e5f81107d186c054173bc705e11a648a5dceb8435510c3cdc80c9984cb9c9c362840d44265e7e - -OutputLen = 40 -Secret = 2c94c4873faf4de3e93152b49428c92c865dc58e1e336ffb9aa50523db6311db34d5a731164073d7958506501cdb4dce05b845198e6fefe63db87837c2434850 -Salt = 27fe559b6d92995338283a776159856285474b74302dedcb3e7fe191490eab7f580212cfea6f6013388e3db28443f454280572b90f0dc2207fdcc0ef -Output = 42885ac518c97bda290b548b597b7f04b20bc34a0a6d9dfc89a446d9f23a1cccc37608feeca7a4c3 - -OutputLen = 40 -Secret = 0ff2c279653a7b954afb0096c2b16e591fa32eef39edd8141c6513d6dc6c0863af0e94bfd57b17817cd1038f37639cf8d63871aef46ee81947526bc5454c13f2 -Salt = 16ee1daef6a0316aa0467646c521fa30165fe336b249600f1e565d287b97018033e2bad45d76c6685d77339b27ebdd9cce1b34c1e4619a97774d94e7 -Output = bc0e3cb2b78bd9d6e2ec544672adbe44398fdba7ef332f1c4235c104ca32ec00fb47d47209e15197 diff --git a/src/tests/data/kdf/sp800_108_fb.vec b/src/tests/data/kdf/sp800_108_fb.vec index 9864926d9..60e92a2f1 100644 --- a/src/tests/data/kdf/sp800_108_fb.vec +++ b/src/tests/data/kdf/sp800_108_fb.vec @@ -1,1808 +1,1456 @@ +[SP800-108-Feedback(SHA-1)] +OutputLen = 2 +Salt = 0976FDEC7817D94D60C4E0C9091D82E38BCFC58D7FFF0829A13D1B4455B8 +Secret = E6EA4E4F7178A81230A01DA05705B9C8B902121B +Label = 37935CBAE5F5B003398F8E3F +Output = 1092 + +OutputLen = 2 +Salt = 614E4B95FAA64CBE30CE47D9C426536A54F62E51D5909F8216204075516F +Secret = 5B5E2C32E98F06AA4868EEC0EC18D53904DC0C05 +Label = 6EE961F615859CA0AAE6ACE0 +Output = 419A + +OutputLen = 2 +Salt = 46402D8C205C356E9A09755ADC2BF243B55B14424B64DB419E0CEB22C211 +Secret = 6611CF92C30689B302B190A7B720359A6F79AF93 +Label = C1E9241EE2203B12CE1147BE +Output = 5E6F + +OutputLen = 4 +Salt = 7076D22CA13A7779832FB764C0CBE278213ACF3A2F2CEDDFCFFA2243749C2170F3646A6D5FD6BEA3 +Secret = 11EB3B1B4524BA22BE88FC4E3D47F2569F60931B +Label = 5F8EEF37E520ABE310EC379F +Output = 3E0CD40B + +OutputLen = 4 +Salt = BE46D5C76B85BE996709542FA9AA60CDDA3FE99899082B537E8BF556510AD4ABD3B1434FF5D9F63D +Secret = E15D0504DD1DDB7EA92FF4301F969C1C0B4D07D9 +Label = 79A4DEFDFA613F5C29A35C7D +Output = 3BD4D1A8 + +OutputLen = 4 +Salt = F07A118615CEFF373C3723AB16061DD95C6D535B670768966E152A97961424BD5A15AFF1748836E0 +Secret = 0B63ADE140256933576AFC161D8CDBE5B62F90B4 +Label = EA0FBBD5833377DA154AAD39 +Output = 286D69BD + +OutputLen = 6 +Salt = 0CB7AAFC183A43296EB6BA49D8DC4D17A46683C6DCC14455CDDECEDF969A2E172318532B9F2BA7F7A71E7F294E9E32EB1C02 +Secret = 68FD8E6F60FA14E9D23FA9C5198E4842103DE282 +Label = 08092ED5B72B8E2931DBC3F1 +Output = 9599CF589F86 + +OutputLen = 6 +Salt = C5B4ED1D8603C07AC416ECDF7EC8C709C54899A15235577ED94F4CB627E2F858E419C39DA77A293B5BB815A117212054D6F9 +Secret = 4EC193CBA4D5ADF08466BB945C216F0E1FCF6F37 +Label = C3598AD3C2217647BCBFC340 +Output = 9FA6918B4224 + +OutputLen = 6 +Salt = 91E6B34FF9C1E0C1CDE062976AD768EDCD35EC9DB7C0620E41E5497A4093BB6E66AF0BC5952518BB92ED51257FDB3CE4690F +Secret = 58C0869FC5F88513E3429FD9A0DB3416737BE168 +Label = EB9A545FFB6F80101F8CB9C5 +Output = 859FBD00DD03 + +OutputLen = 8 +Salt = A69B2B585CCD4D10CCEE0DD03019F7C35E201648BA0E1F32A0671725934E387454DAB8B0DE1D53F8950EBBCD47D4F363586907C0EB49645E8F9942C0 +Secret = 8D033EC3109840AD29B34F250CAADCF3FF22C462 +Label = 9B77FD0C6D30231AF1FDAD2A +Output = BF1398D5D6196C19 + +OutputLen = 8 +Salt = 0F0B5F366E44ACACD3E916D960FA2B8CCE73A04749E99F73A09D8A17EAA9B296374F9C4BF8B048F662416D71BD1B5EF16C00FF8532C875F15340B46E +Secret = A58635ED67CDA2A469C3303094007ABCBBD8CCB3 +Label = 5B3C144F7FE251FDEA82F655 +Output = CC7AA19EDCC29BAF + +OutputLen = 8 +Salt = 35617EBD57AA2B022D095C757404B22CAA590FD195E86480F8872B6123EE269FF48ACDB531048E46F03EC6E7005D65F659E555C565CC810639CEECFF +Secret = 625EFAB9CE5F86D9D9CBE2F0B6E7C877F44B8227 +Label = 3B20560EFE6C30FB8E4CB0CA +Output = 73FE2A56CC343BC1 + +OutputLen = 10 +Salt = 13B0942F024F57196435748E4C6FB6ACF9778F96D5324B7A9D3729FB59B45A8225FFCA9492A887F34E772A7B82834129CF1981C6AB2F57B1AC07FB719A05B0A9F02CA7FD2C01 +Secret = E0ECAFDC43D9929CCDBCA1814EFA9724ECE2E688 +Label = A6748C86A08C314E950D971D +Output = 2E284193244CD30FE59E + +OutputLen = 10 +Salt = 1252425DF02484520E0A9DB6B419AD8FF0D2E11D9AB0327193B21BA4131014C5B617D6EEC37D4CBEA3834A7C20A30BB42569B85A565D66430253F2E360FC5673D84444FB8C43 +Secret = 755850C67A397993E9620173CA61F4CA07E42E3E +Label = 2C54C446DE5E9EA72BA1C1BD +Output = 376FE7404EF48F344EC6 + +OutputLen = 10 +Salt = A11F67881A9880CCECD72DCFB8D694D053043809E4ADCEE6F2A456518EEAED73A23CC7F2B4012F62443256F677F433B31AF05257EB5328102A8571D8E456DF020127705A3E45 +Secret = 2BF61E216369818182C03D4E408BB2F887D12C83 +Label = 776AF03F572261EFB8D8C016 +Output = 5F639414FED8C8B480FA + +OutputLen = 12 +Salt = F3B2BCC3B64D0474BC47C982D2AE31CBB496C0E3CC786989495EE8355D177935623D54713C0C1AA1F960E2ED3D31D5AB36F06343FA43143F9D8C94D495EECC1614C9DA11DC9AD9B4E8482ADFA29D6C7A +Secret = CA6CDC9C6BA78C86FEE5CE4E3C0805C49DB769BD +Label = 368B4457D550F0F830930433 +Output = F5D83B5FDD52B22783A90734 + +OutputLen = 12 +Salt = 43843866832A7852A4C6D0687CEA925054EF1907ACF84828E4F2696F7FD22ED4AE5B607AE7DD56A0DAA30044D4826D8A33B69FD12B3CAF37E9EAA59C106092A0D6FD35918A250CFEBDE372317E73BF48 +Secret = 13439258417DBCEC57C695B7C6A84D7C7A57BBD3 +Label = B29723DDEDD32CD2C0F98A43 +Output = A40EBE7162CFB10E981A3694 + +OutputLen = 12 +Salt = A91CE9C04DDFA72172CA30397A6814E8ACD7391F9A0C3C0EDE037438DB10870D82C4031CDB2FD8E572A26F934DC7974BA22B37EB5BACA7E261D1107B01C296D39E8D346D1ED42F2944AA609B464EE43A +Secret = DCF40415D3952F945C36FAA496CAA41B7E0C92B8 +Label = 61AA4706D8D66C2D2A96E8A5 +Output = E59B19D9C36A49AA41A92864 + +OutputLen = 14 +Salt = A58097C9D797CD0E188AA4C7D9F9C9BA4E33DBA320259A921B3073F22D64B1A98ECE0CB9C0E350F454026A0B912BC987DB54B0FEE65348781E0BD99CFE1659D7CCB76B7399AB0C6B6EA37754CC44F31D7EC32F0611A531FADD31 +Secret = E1009D2DFBA5F534C48E211DF4FD547D6A4825CA +Label = F8516216D86EBB3DEF878B23 +Output = 0BDFBB22A0D5BB15C6B40AA6A4EE + +OutputLen = 14 +Salt = 4B42322398163EE56486E24AA5C5492AB999DCBE4D2D3F55B1ED114B37236F3BB72754241A4F60DBD93C3A000EB291BBE7DEE18DC945336F7A8C385BBCD9895B6009BFEA8C78861785A3E55CEFE3E345BE55C7F0DF259AA902C4 +Secret = CB5CE7783D8CCDE6D2A79ED5641B18C380D9D4B6 +Label = D82E93DCEC7EDDE1536312A7 +Output = 168661343D412DA621FE1C175992 + +OutputLen = 14 +Salt = 4F76BF0D6EF9AF1792AD50F4761CB0AF1070D6AE0C58E6D1B7B7A14092A70CFCC63510F2DDD9CD5CE0E5902A8D99944F51556CE61BCF8BA89FE83A80B15FC38251CCBB9AC563FE34075C73AC1F19C13C3D68C208859686339793 +Secret = 555472B54A97E35B1CE86D633C861F688658E7C9 +Label = 1DFBE51F30380F3AF46A798C +Output = E8849D82021591C19459D7A81347 + +OutputLen = 16 +Salt = 927ADF41244814216739B751DB16C1C43A0C0A9616171DBDAA72046B1AE6256D40D58C671C5B34BACB0D1E4D8A619DECE3779499AADA32A01A8ACE1593EF19453A1513E15EDD6E07206A87CE40D500565F582634A59B538708C86F2D21376FA0DF80FDE7 +Secret = FF41A4DA3195C9A14803C9E7A4E334C6290665D1 +Label = 6EF96F422708EB07A65FAB96 +Output = 99B1311043BBCCCE2C2989B82376DB86 + +OutputLen = 16 +Salt = A37486353C351869D0777311F016FB35924D194446858A70ECC437470D52667F362B1B7815036E81D1105EDBE93FB5DAC31C5C5CCCB8ACC6198C720B1CC8E23C67C8E6D31295C54BE2C75B554C0F0CA5FD3D9492B2E2190759E22F133936E46E1B93D6D0 +Secret = 8B45AD68C2FB907DE13AD8E06AD208D90000FEEF +Label = D60A73584844D4F6CA0AA998 +Output = 39283A8C0BAE3E6F6E05695FAEC3F45C + +OutputLen = 16 +Salt = C17533C9C9E343BABF1C6F41763E0F1ADA24D39EE9CFAE9441A1879A82B27D2B3D8A1F4E7AA6C434777147C515DCDF389352744E012E4D2E2AF8EEC8B491C8D7F03460DA3AADF6C8A32EF1C6E0837A7AADE8D3F89E738759CD39FF6C5781EB40B2469073 +Secret = F630E2005E2DFBEAF7B50C25AB8138AC83930D9E +Label = 28DD67883135490B227BDD73 +Output = 46A0A494750CB338376ECC6110274FB6 + +OutputLen = 18 +Salt = DD75DD867EF7A573CC5AE41EEA2B5AD127AD2657A796DB7AD1C1BA112A5FE73B08341776EE04FAA748455B6BE038BCB45A456CA17FE72ACE23B8EFD8E3A593858B93FB282A1624C9FF12885513DB00F7B9D754A083D6984A2538A975B327C73CCA0CB76800DD9771D173CE6512C4 +Secret = 7B5315E2831B7055352E8719F4D4F8C7E561E4A2 +Label = 83809DE8F6A8D4299489E347 +Output = 56A185C640E89C7D688D2DCFAF884B2FCF95 + +OutputLen = 18 +Salt = 84DE71E8BD057DCFEAE643B858014A658E8AAABEEFCCDCD2C81E0117D8561CDD766C9355BD0A5ACC8754A6D50DC74603FB251958B90FB099ED0F40C8CA0F64E22FADACB1CD7401A8054E42CBA44AFDAC5852868682934B991BFF27C5AECBDC325A736EAA425D254ABFE75A7BC263 +Secret = 672F0D36E84CCB8AD7214427B7FEF9594DB6B220 +Label = 5B7FF3E53B93D2929E8C69E3 +Output = 568F347C19BAC50F0C6743DE8F38A0B52486 + +OutputLen = 18 +Salt = C906B67559380433E752BC6FFEF6523D8755A2113FFFD54940D1D9CEFD293D9A3873C0095AE0217BE6B14EBFBC8AB823497B0615F554C2924D8276F48F7AD0FD48A9E383D1E2134564B526D84E51BAF6A8DC852B1D8ECA936DEE4CEF1E23E803EA11EA6E9F356CCC53868CFA6E79 +Secret = C9819DB28D48D732C70C8FD9BD2B07C0E876329D +Label = 0A4210CF67CD0368A77A979B +Output = A0DCE35B9ACB90955B462213822D57CA5B2A + +OutputLen = 20 +Salt = 314F85D1E8BFA91F2419B25CCA0EAEB58A6E77244B20FEDCF458B6656CD0E67DA2E417151DCFAAD5946EFC97924C89C9BE7FEA6AC66E7AF8D165DF9C252BFA0F0D00F8850CA49177A0CCBEAC1F0818ED8D1D7AEA7455C608B22771A18F1A7A9974FD4B1BCC7641C404CE650A737DDC759232B662E2AF403A +Secret = 3B674A2DB34DDFFBA29091A0AD3077C9DD4CC245 +Label = FA9877411DF9BBA2B96706EA +Output = 4371D87E4A58F982AFDFB70DC632ED620D76F14D + +OutputLen = 20 +Salt = DCA39AD4CB69CB55B95F5D46AB0CEF077B8770B1D39817B4F90BD20053E25E57A15F42FBE27E34A9440148911887B6F5F344681F3E18AF8A70663B9842BAADF9A526E77832388FF68ACB4A1A8E309404A3586613F91C470A7C3073C8DB711903A81041CE437A02AE2F83BADE5A94B15474DFD854F7480944 +Secret = 1B41C4689C521FC70386F07E7AD2C765E0CE8DDE +Label = 30F648C16E52BFB2A134D1F8 +Output = F5FE75B2C2C66490CCAB8E684D42A7EF9C7A6C54 + +OutputLen = 20 +Salt = A6B31A1DE253894DFAFB28853F7707913467F0855E8AE5F38D5AE7D2A23B46294D322AB511390CF807293CD06F8D05DC3162F77FB198FAB18616EFC57F6E7844556322B8A03E1F2C5E1C700D6F90ABAC58C035ACC1C9843B4D60AF4DC9294942D4CD52AA5E2C638C78A5063F082B4648C9386195F7775EFD +Secret = 1A2A3B280D3246257CA683C5A267032BFEBE936E +Label = B686D252600420228DB788A9 +Output = BC1729FEBC2B31F685DF5A12E1D00DC88E39FF44 + + +[SP800-108-Feedback(SHA-256)] +OutputLen = 2 +Salt = 8BA32A09224E2BA61EADFE345E3978950895F605E73867946DD1175CC836421B6318D9E6384ABE5F323E +Secret = A7C84831ED751469D67BD1341502F8D9CEA242F22B603A82B82E5F04124E14D0 +Label = E7EAFC5B1FAEA3AC16E3B0B7 +Output = AE76 + +OutputLen = 2 +Salt = 64BE18CCB62BD293F824DA34D95E27E2B0C6C48259F951A1512AD18AB5AE8953971DA0347B6E9BEC3AA1 +Secret = 314F3948506EB6A1F3B2E4D7735DD679094AAA8523BC18F4433C4D4C56B83095 +Label = A8BC2B363B51FF728174D926 +Output = 1628 + +OutputLen = 2 +Salt = 2826F4D21FD8E45D342FD9F076004146CED512DB46C053FD057394C8C3A9E6A768C17246F9E73F221A14 +Secret = DCBCB03E733FCF9D797C363C93E507CB49714CC96A943E9E3A7FE97DE3AF30A0 +Label = A07BDD468AF3C087D74AC4A0 +Output = 9E15 + +OutputLen = 4 +Salt = A0AB5B5844178624550285BA2836724D4E6FC1B636744FB6133229C6E6FA2B9F7019C075B91A85D069D7E5E74F22F76AC466A233 +Secret = FA25E1934DFC6E1FBAA58834A33AC50CADB824A61E4FDD2158B37077874EBD03 +Label = 80E4A4E5DA549E535C2C8D90 +Output = BCDB8EA7 + +OutputLen = 4 +Salt = 78928579A5223313EB347915EFC7FEDA657A6EEECB83EAFA63A13CFF6B253977E4BB563E09D549EE616F3C52EDCE6CB574AA6577 +Secret = 2A14356728AF81AB32542A8C787F4124A305E011A2D0754702EA2A7767F58093 +Label = 8A8AA3AF09CC4F296B913DC7 +Output = 2E282D86 + +OutputLen = 4 +Salt = F842FA438AD547D59CA86A12537220E7CF869D3FEECE55183EBFBDD90D32494EE22D32E41A78EA738506CE7736B5C597C0BD1BA3 +Secret = C67A07587FA4E362E11B7B623679B160AA65435E5EC0B7DC0E73D22E613EDF89 +Label = 98B73487EBCD07E71877CEF2 +Output = FE37BDA2 + +OutputLen = 6 +Salt = 6488425FCCAC6E28EE44029CA1698C09FA240200E446EAE74212267D2525E9E3A300C49D8B98EEFE3940FDC9998848E8B0569A540304020DEFFEA989BEC1 +Secret = 8B739BB4A7F84DF68527D7DF41CCBAE180A76153DB8994E4F3349EB6D216A400 +Label = 13F62EF70FE1BA3E264DE948 +Output = 77CF464B9F97 + +OutputLen = 6 +Salt = D623D6FCAD0D1E5CF81AACF12F3CA288E7256DF713C8F68B0AA6719460B7055CF71E63FE0F775C2BCBF4265C4190A8D19E2D020C7238548B1052DFF8F77D +Secret = CA4347997DF86A766F17A5ADA44C937F0BD121E132DEA47E6E2A686A04E71603 +Label = 1BF99C6651FDBC968E119584 +Output = 3F974476C20B + +OutputLen = 6 +Salt = 947376F71E1E9525C80EFB07D7014219FA6ABE4FBE37397D22BD683DFC0FC9B7EA615E3F28688AEC955F14D64E7941EEF2E07BF11DCF7E46445CB9A41844 +Secret = E8C87BF381EA347188F0392546800959BCF6D85243BBC0E3CA8102349883A6D9 +Label = D402969A596B8EA8099A7937 +Output = AE22D3157BB4 + +OutputLen = 8 +Salt = ACB78D432A8177174C93D2524427B216C9FDB6077C092EAD519415C3B5B190A4AC0971BD40A5FA2504411139B5F247A6615FAF6300B0993034B4F11482760100B5F02C9B5DE9D1CB +Secret = AA26645831D5E8C289537EF0ABF83CD20105CC74915A4A40B4CE87FEFDD9FC76 +Label = 2DF6BF21F802F2E3BCABCC93 +Output = 34F73AA9A33782AE + +OutputLen = 8 +Salt = 93B55045D45E052A4EED0B9A89C1EAFC925795DB89126A684BE3BEA44BC8EBDDF38D650A983F712B0D2DBAD1E16297CFA2B4C057A95D890EAE948C77FC2F27D8C359BD1B74D6AF59 +Secret = 89D98440A2BC1F775479115675566FBCFA067543A8DC0FD41D125D6A727787F1 +Label = BB0AB23EABCAA7C9F8394D89 +Output = C4EE826213803355 + +OutputLen = 8 +Salt = DEB09C953940149B6432089005CF096AC8DB2AF5DB0D7F7C1F86774388C72F0FEA6DDD5719C511CD8D97EEE267AA7AF1C170B5BE186F457DE3722DFEFFD1378B12753DAD1262844B +Secret = A736FE06C81A868D09388C87432EA74972EAD388EE048C18ECD378956F3B1BC1 +Label = A188CA3CD703F649AD1DBC34 +Output = 1622B368B0D5ECC0 + +OutputLen = 10 +Salt = 5A9EDB68211505D4B75214FECBC956017C5D382A61A8EECA4646852807039838DEDB4A112AB53E34716FFBBFC54F9B2AAC0F7595CE0945E1CE3FE847FD2D5F12DC66DAADF2482A6C57F39B735F0364C075E5 +Secret = 045FEE41E9EE0E27276B29E41DC0195D076F924C63D01B3492AD91C8FA194FE1 +Label = 6BE32C52C44103269F2ED704 +Output = F793D3D6A178356891B9 + +OutputLen = 10 +Salt = 4BCFD0FD258DFA49C9EFE8184CB5C96E02C2BED0041319336EE9F40C7B558186733DA433AF7C887B05A02E07536D3D80254BEB9F39A32D1BB732CC9CF9C71F3E4DB1BFE34FA9F62055E83F665BD718535CA4 +Secret = E3FCE9D45422CBB2EBC254BF9181E5C6C677C838C0A36D3A537A05ADA4A01A85 +Label = DE23DBA819A0C86E13E17526 +Output = 44B8B6E419AED8505DFB + +OutputLen = 10 +Salt = EE8789D3D023978AF25F80091F3E0E82897C3490A7EC53821D26306C8BCB29B62AB13C44A410D06DF098199A1379A9748F873B333F991739F64AB575B6D124057592881B4DFCE7668299E16D8A32DF7E5547 +Secret = 91748FAA61343EEE85154E9F4E4ED134648AE5EE3FF25EB425F3AC85A1E78DA6 +Label = 550905AA6458BBDCF2D9FEB0 +Output = 8018DC8A756986D0A7C1 + +OutputLen = 12 +Salt = 62EAC17784D9D4BF0FBB5C4754D184FD9C5DCC6CC86DA259630B64E1D9C9F522E4409644CD5D67F4E28A466609EF98D5AB450B0DE65BFE388F62085330662BC8DFFEA29E0D4EFDB91D2D36B0F3FF3628DAE2EE5EB0EE08786585E226 +Secret = 97C151EF6E40CE0677D8B66DF0FADB13A9903EAE1347899E4C7489F9921F6E30 +Label = 93D9D2B66A73FFF00D393D1B +Output = 32468E9F15EA0A7A047B8978 + +OutputLen = 12 +Salt = 8686CBDBFC8342BA6A2034AE03AE9F7B25DF25659431CD9CDF518FB4243E8B3D6F6496EB23CA2B4A7C88A979905AB19950E70199201A76CA55DAFB63FA60BFA3455F318DEB9BC56423AB25FA5076FEA9FEE93881916278FC414B8342 +Secret = 5E0D80E40D9101C86D6688DFFD01C2E28821963B3A167114FE65D9D202A4FD95 +Label = 69D3E3AC879514ED5F470354 +Output = 91E56A82155FC1174DFB0537 + +OutputLen = 12 +Salt = 491EEC0D7C1521A123F2AF2BD1EDDAEAD981F004F53E3658135B2742973E5CD55F76793617096FE8F9B3F306CF732F547127E1DF9D1276E931BB72DF1D19C3DE991094BF68A59190C4232DBF89D5AF9C7BE8563AA81DD2F4E6D5AA1E +Secret = CAC51ADB3A9BC8E507315F9C8FDC1277818F375FED324C4AE3A84489F003A0C6 +Label = 50E3D3615038DB5E6717DD33 +Output = D505BB621AA57B3C5BC33677 + +OutputLen = 14 +Salt = B94F1E80F418E49E4599EE8E5D6389F7A1C0FA3F6BCE1CC64EB27CBA5D722722A4130365488F363AEB0FA02322FD1A34DB1052BF39AC57CB6796C8BF910A020D8B1B0149E7DD9C5C8425EBBB17A238ABB2ACAD9C2885E1EE5F8C8959870ED20B13FB2470F083 +Secret = F4C431F66AB4A3B8F11D156C56C6D19F052A530DA4724C7131C5958069B8FBCA +Label = D6ACD12B49D11A0BEF549F9C +Output = 604E14315BF393A6873ED0FD7D2C + +OutputLen = 14 +Salt = 9F02990268F6C049B87A9F1C561BCFEB85711B4A44939F4033338F10CED0A61FA3DEE1CB9CAD4714F07F8D3AFDFBA0DD64AEA1341117563E64A4C81FDF6F4D7FDC60544F049048B198EFDD6D88222FC55347B10A615D91E789C9E5BDFAF6B3B3177B2AE593C2 +Secret = 9F7D0D983F64BAE11869C108EB0F195A1EDAAA176B410B634B9CF5900214A4CC +Label = 28C878072B35C381D33D5AA3 +Output = 4895A1E8940F153C6FA8B82AB5C6 + +OutputLen = 14 +Salt = 1998365EF45E76BBAD70B3DC6E5F9AFF3853C1C4B12D2BA8BE6E8570575D6F1AD0EC74ECB85324E70EBB05C255641D3FC9850898638AFB766D0A5780B2D928A99370395CC2EB8CED6B45DEE14851286E765B177C6296C8F5D68215D39E1F268412D23C325F1A +Secret = E8366E26D0805B98E478618D6346F9A3396BC16EC63C2AF92B9C943B66EA8664 +Label = 35ADC47120E81F0B5ACCDF59 +Output = 429F061FAF71A3FD96D8731B0B42 + +OutputLen = 16 +Salt = D7BCB82F08E27C7B20CE4B115EC664F0F25DA6495D7791A8764B4CAFD37209095E79EEDD6D7D30551B4F959A19CA74BA661F6B861E18DA05C17669302B2B05F2C9B0E64861DE0EB21F74396BB6B33741B8A882B81AC3AC0C920E7246AA29ED850A1A944DB98A8849C4D913F8170C2A37 +Secret = 9233AA72F96935CA8AA997DAB687BF1376C08C82FB789A5E497645B11904F3CA +Label = 601374C874709390EDD82456 +Output = 760BBC6A3A120C3AE316A4E151BE3C4A + +OutputLen = 16 +Salt = 183406C9AC3ABF852E30B00E1438F46022834F84A93B4DA8BF3174F1E8525FB210BC6B27827F837BD0A798792325B129A47B85CD2207893D14BA01457CAD6914869FB4AB19C20EA3066948DBFE0FF0D66DB434B6602D38B8DF6F60E6A234A3ECDFA24DBDD85F7886ACF1138943205903 +Secret = F572E72E6A97B6E9E2B0418B4C0192A200177BC8135D9BDF444AC8C32A898B24 +Label = 2FED8059DF07D537C363DDD5 +Output = 28534C9036AA9AB1310C687B0874A1C1 + +OutputLen = 16 +Salt = 8EC8E678EA5C45F48F06C7F84BAFA9A1E86BBD20180A18E3BB7154073D7B27B42E460D07165593B2F430C1E6A6CD96C2E08DBF7B474EAA76EEDC29241F8949D2061DA9DBAFF6BAB7CE44AB349D9C41E4A8F6C48C68BDB484ED96C9B9CC7BE31C2BE7AD38BFB8EA253DE73B6262E27123 +Secret = 6AD1F06DF56EFDE1996B1EE3D741B2AB2E9B0298A85FFDD9CB8FD406B726C13F +Label = 7AC177503939CEBAD49DF00A +Output = CCD19645F92C4E9A0A911D9555E8E605 + +OutputLen = 18 +Salt = D604732185DC353B940920F0DB95888516EE168512D41DF770F668160CC98F4DE5A9621FDD13A5D2B31BECD0161BF4A43870771E9FD7F7449B6C8E7B9CD20237F1D20F528A35F124F4008CF829AB2FBFB1B084A5D8D39F0CA28369A23BB8C6318012A06F4881F88CCBBED907A28D5F0B81E352E827E7680AC995 +Secret = CF017AB0894790985C8E217F49313A06DD3EB0EA5856CD9EEF80E52F35D9E6CC +Label = 0A1E5C7D30661093268768E7 +Output = 3BF2DBA722C88078DCA3C35A241D8EA2177F + +OutputLen = 18 +Salt = BD4B7B3EFB62336F93B286432B868E452FCEE0D57D02FA8B1A185162DC64F4FA18C73C96929C6192086F392E7936FCC4796BA98E5BCF162CE88E5F1D0DD3F8C9B3D6B16C51FD7899418E9BAA1BBDCDF15D8D15B22641CC1D997DC0E6B9FBF549644BD6AF236D732885CB39D5BD0E938D4A52885034ACE8DBBDD9 +Secret = 3DE9225AA722AD8330426DA02EDCF606963360F41B7DA7EC8EA3CCE58288B722 +Label = A43697A4E9F82862DE052EDC +Output = F13D7F216C10D44784542FDD8B7EE5BDC147 + +OutputLen = 18 +Salt = F249916452453E57565B523BA8745CB24A284120391210B47CBF398180B56845E72EAFA20142114EC4A6FED9EB12886ADD1B132905C32F2E704DC3CCD385BF1C0EE5A3DA5273E084F9D17C63F6E4252362A8150B47A07F81B279675C5658F9D19F42A889CEA22959BB82B4E764E3EC5551DB6AFBF2AF06CF2C34 +Secret = 068249D295A65BB64C203528652CD4A7388FB4F05F22BEE217968F7A743DDB9A +Label = FD05F07133B185FF48FC7697 +Output = 8BBBCEC4C6EB59F1874ABB076079D68BC55F + +OutputLen = 20 +Salt = 2AC482A92E75871626DB2756272BD90B695112C54BDA3CEC03C0D5C96FBB475F66EA9E3B366E3C03A9453096D102A4844488C9550E6C57288A1D3F500137DA6DE439FBF037BF0AC2E19A7E8B6BFCE201D9001EE9122EC664B25A19C9D21E647EE13070F71751BDB5DCCCED48E48A780C91AF3E40369E0FC11DDA91FB29107B57AD266681 +Secret = 1269BC3481BD3F253D05CD53942028C6730BD15E3A67A492AEC6F484E151ACD7 +Label = 39764C3E546BF658699FAC90 +Output = 703A012BE55EFC34ED8E7F16984D7C29AC219CA2 + +OutputLen = 20 +Salt = 30B2B524F5C7B6CBAD351730F5FE51F87E7481987D3BDF1190C2ECA6FB8459A98664FC80F868D660FF393F8D930271E17FEEDD75BB303F69B20CCE5C19E16BDB187096D751FA7CCD2C7613B26A6853E35BBA678D5FBE15B5F64A8FA0D70770D054E42C022BD2039728B73248BAD8855B646B74D420FE4D82420BD9F93C8DC323F6FAE860 +Secret = 9239512903A9467FCB244CAD769E3585C0120A75EB4422F99FB45C36B2415BBB +Label = 6432A550CA3B164A753A5C3D +Output = DC01C4DFDCEE9F2F632078C6EEF129E0E94D1FC4 + +OutputLen = 20 +Salt = 637C021B0FAE981D43464BDA74387DDA6731EAA14E680774FB67EC0118DA064056434D26626A2942A9DAC824A68B8EF2E38E960331FA1C71553635ADFB5A55C8E9D972D092BEC6A9C62735C5826F89A9F07693D902C4FE23FAA02E6696D8807A257F47501517508959B32CB069C0BF4A945CAA44FC7FF97923C45FA25868596F11B83D4F +Secret = 63CC34508D9C29578F23040F0EBFF4B6B40D02C95D18B691162E3C6890B14ADC +Label = 6C383B3C1A54582C30699847 +Output = 52F702F095AB0C462E9E2BDAA85E1A41EC410ED5 + + +[SP800-108-Feedback(SHA-384)] +OutputLen = 2 +Salt = 1FFDDCAD8C6DEFFF9A2BEC601CA464A2531FAD765B94D2C72ED24E4C7CBA8C78101C1826ABC88A8A8884CB9C2563787877D95CCDB09D8A843F01 +Secret = 3A1CFF3F51B9656B4DB090DE212E309B810592F6D348CF8157D48A92744F5639885784D244C3BC3EA978DC5000A73221 +Label = E5C88C173A4FC40ABCED7BDB +Output = 1F27 + +OutputLen = 2 +Salt = 2CBA527C52529EAE06DDD69D7A9A98E3D66B707BC4163E17CE731A75CE4149312308B27525D92BA485D1A716B493E65251D8C14A7F17DD7531F0 +Secret = FB7235EFED0726BC66C24C004C3EA8D14A7DA5B426BF9B0BC24CF87B5B84E3A568ED2D87DCA44A6889CB5FBA21B54A7D +Label = 8C65ACECBC71F94B433F4B88 +Output = DF7B + +OutputLen = 2 +Salt = 7778DE368B7C20036D555ABA7D7CB4D4597B3C2D2A5F60D92E1512384F6D4C8F92F45DE6A60F14E41668EFC8273124C258C61779CAE7E0282745 +Secret = 06D59C362AFCE96809E8F5BBB3FCE95BECBF3AA51E697E203FF72DB3B6F9BC38BE75343374C96B76A76BA91A5AA4D843 +Label = C17813B5C52634A2531E80FA +Output = 5AC6 + +OutputLen = 4 +Salt = 0115AE2433731379057AD62F046250D20590CA9AB8256BDDDC2A8A703B90483BACD6912EA7FA50FF7E0BA312CEAD013B6C2990EE907F0D47090D90E2C77219B68446D159 +Secret = A9797757082EE44523B0471DE0A3002B41591294B42F47E128FD508666D058128AA495EED8E4EBAEF1D5E69B5B5CB69A +Label = DFB23970E620DD34EA2FE97C +Output = 1AC84C8C + +OutputLen = 4 +Salt = 51E09829AC0C6B094D968D593458061C1042007A5BE1BF64A910E1E44424366BAEF86DFB19B4231F821AF0FC99EB89EAC56819132C987220056D450EF37A7325C27B190E +Secret = 22E57255D11FE3BADCD30C207F98268D20B187F3DFE1DC3E5CA718B4A6E266B88025144C3D777EECBA13FBAFFDCED146 +Label = 559AE2A94EE2E3165AE91E89 +Output = 8904EA27 + +OutputLen = 4 +Salt = CF0E4AE3F83B79519BCFDF022EB5CBD732566BCADF1798338EC7132FF0C4A2BF048503DA67A6004E1A1112514FDF469A7CAE4B381EE295CEEEB73A1A675DA2A946F03795 +Secret = DF94CFA19A3CD9CBD164C0FF9DB9B2983C6DC5B887A2AAD7E5FB8B4ED2B1F7E4B91365AED2C7BFA6A1879F3612008BED +Label = 18988C06528F3F06CAD532A8 +Output = D6873D44 + +OutputLen = 6 +Salt = CC68F95373DB45F128AF8A4595FD4C0EB386BA2E56F9084DD821F12E0D936069CD7CD36560E1539FE2554D928BC8D94D5A1B12C1B085EC116E0946895BB6F690C3A76FF66118334C0CE5D479A01B +Secret = 855224D63FB64FF8DBEA82E0BAF7A050BE9F93565F38FEEFD846F467676D06BD38266B44F369F8C29FDEE36CC13C299A +Label = 52F068255B34396026DBA455 +Output = FFFEC499F2A9 + +OutputLen = 6 +Salt = FB4626A4B03792105828C2EC13F2F7945E6306F3205F020B4E0E56C3C78B4A3A0B3E3BFBA6FE750AD2DE69A530DC0E6356E33BD584E9FCDB511B0162263E29B1E1144A8CF14B0557AD5EA6CB9D14 +Secret = 3E554CC88EE5ADA08E21CD666798BF4235FA103A02CD8DBBB2A2B2F777B7889F74E807BEB92242302BF9D1D77D1B38C9 +Label = 2B70224EB3ADDCFCD913EAA4 +Output = 75E620E120C7 + +OutputLen = 6 +Salt = FE805C4C3FDDCCCC14F48AC59E7F321B59E956892B5BEAA1C9D6AAA39D8C3DD7424ABF6FB5EABF238F44FEB5F11AF307CF9E9159EF41737556E50C1691FF24375D3D9B04ED2A3F58F9A147ECFE46 +Secret = 7357F39ECB34B24D540A68D546AF494E128490CE2DB9FA40668BA23568B5A7AC0203F5467DE8E336A704FBB580B94695 +Label = 7D983C21B9474BB138D59126 +Output = C3ED2ABFBD60 + +OutputLen = 8 +Salt = 38891D5D79366AA00C3AFB4560C6356DDBCCA1C2FEAE5C677BF3E18706A6F6281976C37FF63B088D20C4C146825B111E79B2C8A86C6F2D4376D6B852637C8E348ABD58CE10F53AC9B6751D194D6DF836DFC3E5053212AD95 +Secret = 1699E0C45BE7011AD0D96EB831E5FEB17828F35E6C64C7B543B81E283616C531171A2779E009CEF1C4DFD94A3866F838 +Label = 0D2D25E199B2BACFBED0982E +Output = 81D2A48A42F90563 + +OutputLen = 8 +Salt = B5977814E02F987CACA32A951D8D64E30DA519951EEA1FD15BBA0E0E8FF9A80C535E47D5E5A44509A0FF27E184F1019551B2A22BC53EC7BA60F6C66257135A49AFE314C972F4A34E539EAAB5419541BD3B170DBAC8C27FE3 +Secret = 19DCAE47996B1EED382D6BB83F1D824DA65D660E1AFAA62F9E4EE6874370FEDEC6C278E87CFC49439012A5C0B3D036A8 +Label = 4936F2ECFD48FB3A047832F7 +Output = 924D81CB7D03E4F2 + +OutputLen = 8 +Salt = 9A0EB2C5DB0926CCC79AD9C242903083DC02941E937CAF8A80496A872C9A24A763F64B9F31F3A00A76EF3DE9DB3B9C2F0F5C4CB9C6FB44CB563E0C4FC192D18C233CAAC869E36A46DE573457E61D009181B6FA3632C95345 +Secret = F9EF4139D20FEE3E75FC8CBE3DB0C83A766ABE484D5C22307342B5EAEBFB3D263BD9C96AE1A0EA308F5DA9EC0994CCC0 +Label = D0D2E4A9C9CB46EA4AF63C29 +Output = CE791D1635D5964E + +OutputLen = 10 +Salt = 0CF4A652C5AEAD5F275EDCBD4DC168FBA94C666ED85B8745D7EEE188C01616541B1137679CE8E7966F87F75B9D3D508626126E0A08424AD3EF51B65317DF93B5C56F3CFD32112EDF29A90FB456F5686C957B11AB461B70393A30FADA4E1F2C4B35C5 +Secret = 0F5F55CAB2F27A610DA4C5403B3AE5E9FE882FFB743B558B99B8F01E35B79929B6D0958A058D20B932E02D932539E77B +Label = 1CA7570CEE9AD1775863FFA0 +Output = 9A6407C966A97439908E + +OutputLen = 10 +Salt = AEA4395AE9619593A44637DBAE69A1C63034D892CFF8FD87D0A5D7599BEE18113F0EB6D4DD9FEE0F349452D3DAE430ECC8A2DCFE89FFADE6DCF94F356D8D97AB0F512CFB5D57F58B379312279D594CC6DD509FF7618961618943EA6C49C1B7910370 +Secret = DEC5ED4063552D2961DEA8AE56D445009EC61AE7D26A93F7EF7EF2AB3FDBF9497DA27AB67BC25A0D12268F3957533B06 +Label = 8FFCAB62226DE6FEF32BA6B9 +Output = 2C3531F1C6CED68860B1 + +OutputLen = 10 +Salt = 886D7415D327C99EC1304A7FF948CF3B8451522489AB5DC5987581B812EBD77483610D5FDCA61DAA5AC22D8D70D2D4CAD8EC96140222B581C4A1AC62C05F5BD5C565589CFE3E3919761A241C2C97055431652BCBBD1253D461EDEAEA4DE35344AA0A +Secret = 0A37FA7FF2804D52B94CA9C33FE6AEA7F1FBD593B24915A82190F851B27276E009DB30ACF27256CE834C491A51E2C0C7 +Label = A96C7898F36C06CFA3FFAA78 +Output = BC18D55A750E6C95D225 + +OutputLen = 12 +Salt = 21BCF8CBB6C5E01BD2FEEC35D8744E903E287B5A873D069C4A2AFEA1BF4B70E78EE15BA39DC00EFF7B4F318A8E41A1390553C4948C829395F144011D3726CD7523A6BF35C56E661635D8359051BE17EA7EC4B003E7ECE0118648B72C1C3F1F3CF288C51B574EF1A05ABC7FAE +Secret = EC3A718264B5C5207187A1AFFC0E47B5C8FB61F824C4F846DB689E662A1354467C628D8B2814D05B5593E9936D4360CC +Label = C4DE509FF2E0467B8E701156 +Output = 420741E3FD2C3BA7469BCA48 + +OutputLen = 12 +Salt = 681E5EDAD643735BCFB658D1F1A78CC443155BC1257597DC6BF58D82C542638839156F0D7630BBAF4963003240FD34C92FB065A2853B1FA7ACE02441EB950DEAB68127549F0075EE3DC6BBB7BC1B8A86482A0DDEAB6B9E99C2511D5FADCBBAEF6D0CB4AEE528CC2437F98092 +Secret = 6CC6C06AFECCF85F01FC7308A5AE3BB0FCB6E37FE98D2AB960E517C773BE604920FF2624A9674453532EFB48F4A416D8 +Label = 001C0AEE6553DA7EBD97E941 +Output = 088EFEE5B62AA992FD743543 + +OutputLen = 12 +Salt = DFC793FC31AA54DF3188AA54CC96B12481D68C7D56922715EA43EA8C945AB3328971A8FD2074FF13D4570BDC4BDBC370FB9191EA430E3318DBC63E9016C2FD0DBCF870E0BA65982F425C249F9E61A91499B80CCDE97A5736D789380F97A88C8E37CFE7D6310F581B93EDACDB +Secret = A4AD9351B252A11A77890F11E8271FAFA128127E7F3C5FEA2CB0FFE060FBB4D4342F151C1DB4DC1A28609D67AF6190A7 +Label = F86A547B62834D414EAA799D +Output = D23296D2863919AC11485099 + +OutputLen = 14 +Salt = 24886F9C75E4487A4B990227ACC62B18E1B5439136E11A39FF013C2719450B8965B53F966274A04324408CC80ACAB907FDEF2A008663ECDF2B89A1E63D5E75856012C1B19518CFEF57882A99B4143FA45B742AE656F12123D951A1AB2A24DC01A7212AA03B67B9198614EA2F562B6B5EB8124AA57BB4 +Secret = FA54903E9B54EBF22B6EE5CF79DEAE7F7AAA007F8BF3B647FE75FB8CABB6966B816B9A3794407CE9DEE33115DFA7F40F +Label = 8ECD12FA4DB2E32CD3A527BC +Output = B44B533A6033E471877FE23C8CCE + +OutputLen = 14 +Salt = 3D3A6E202384D209648AC82708352ED17925374B3E3CC05EB27079B9E685A3F3373E692DB1116341357C67995ADE36B052ACEC265473B544739844747B9B57BB88B4D98279E20450123041800DC3BA19FA434F4035F9EBF5E342286EAED533C18BFB989750309C5006CD50C55ACD5512C2DE37209D38 +Secret = 17B6459563E0F65FF9284B9EC8DCEA00B420EE5366E67F73C861EC4C027D4A002E768CC3E7D7C2A176B1FD2AE68A1EC0 +Label = 0ABC1A16DC0D875E9BD51828 +Output = 97065EB87357509EEB464F67DA8E + +OutputLen = 14 +Salt = 2D7EED6F929912D754BAE862FE7F68037ED4280837DDFA43C973FE44C2E513D97596812932F81B717EE0E36A986F8968FD6585943D74A77DD06080C1A08200FC049D0C0DA139064DE0DA321AC33B54E420B440FD374EC8D60CD7FC0D663C43168C00F6E87F44069E11FD428E73309775B9D57C886EAF +Secret = A72AA7E38CB6B34AE692188FC226F1B0A024F3B074AB89A0EAB2CF0481E33BADA447E7863E9063922030F0CEDDA13FA9 +Label = 4D4E975320F67DA3D3543F05 +Output = F8B738DB97A4494893F5222764DF + +OutputLen = 16 +Salt = 0F5045D7874A68B731B85BAE65D41918835277293610ACB2CCD6BA8BAAAFEBF1837FB23FD94EEF4E86BF4E6AD61C5C40AF6EB808407988109791CBACE1877B3D1C2EA2D3A999A0AD6FE64D75457629E612B4898CBAD1D64B7B2A577FD0878BED8D79175DDA320496F272F056FE1EB5D00C8E05D1D8969E169BD287DC933FC530 +Secret = 45F64F50973EEDFC631CEB7DC88CE21C49F0C92FE8AF5660D0E83E5D8125221B09A37ABB594565AAAE4509F1C2CDCFF4 +Label = 3DA85E2DE6FC1235F2989CC7 +Output = 170DCE2839C9D019FD764F9BD9BA564E + +OutputLen = 16 +Salt = F248835D7746340A04B06B3151A839722FD52FAB27E1835B68B2B3718CFDB605DA162ADB34C53E5E04DDC1D0F1DEE3D273A2B7D18C909A341B9C4E7666748C5BE84C6F3DE3A4B78FE51A56820D61F8A0B17965528BBC02EE18CA0F627CF699FC4175EC9C7CAC3F6C2275626CA281905FE769F0C13B988365C9CBA4FE845C1BCD +Secret = 3592DC354C7D7D9102C191A9765ACE290ED048A99B4B078014FA5F1947237431D7E9C7FE83143E983B2F39AF3AA0CE6F +Label = 0579C4EF8DD484EE10EA918C +Output = 1A87986C94A5B2FFD5DA9517E03E1CD4 + +OutputLen = 16 +Salt = 44097383314FF5856C6FCED7AB8AD1C280902A84295564E107DCF5552CE43FED9BC9CFB555D69DBBB7B9804AF713275F49AE975FA20F2B4440F00704ED4B5AA399EBF4EADFE51013275DEA07BDC85043DCC6A42586B439E27369FD93F266D010DDD2CA3A643D9630BC10DCE91CADF489C01B370919EC7F85057C6070B6FE3DF4 +Secret = B12BA27554C693946A02673638A20E4FE601D544B1D4E165CE0F57558D6B02B79C7BD1FEAB70A231608A3F59B386B3ED +Label = CF19D0CFD8F2F5406135DEAD +Output = CC9CC53319FD6C6B17886FC833F5E4C5 + +OutputLen = 18 +Salt = ABD2833AFCE8B8061D9823C630B86E466FA66DB0F76B2843F00FF71443B6EF2B4EE6C0BE6F41F9EE29DE565CFA6D88B44F83A49DFF62AA14C5B82DFBE824763C904AEC54ED42A88216A8C9624140BD09020D77C1CADC73D0D8154F36B67E13189427E9DDD3690436BE9CC5CFF57E3873C183A9DF68043D1B00FBD9D635444FF51E0EDDC2B5C85C7701D4 +Secret = CFCFA9D7DBAD81BC79F33310A4B5D8A1DA606A9C6B6448DA99B011E3A632FBEE0062DFF93945E89E52910A698964B459 +Label = B601CB920E44101D62A948CD +Output = 67F384E7A587D107C7597D02931351891762 + +OutputLen = 18 +Salt = FF640734968340123C38491DC0DE7D5033A1E6D439962B4A8BE6EC95CD901769366F5D058D8E9C7F4FB47475B2D7A24A5EB9E3E72A632E41648D55770168C136650AB7DF919A42BAEF1CE6238B27972039DA91B562E2DA2B3685DE2AEB1BE1792B526A59B8F48D6C5707507AB2CDC50DF158DAB68744D4A2425CC9834A1BA36D9F010CCB787F5DCD4036 +Secret = 6F96B65436579DDDC5C9EDC8603396B55D360C92BFE60419F9742265DDD10CA1655E6C5559FC5A99FAB531496E2508DF +Label = F9CDD6178D6EF023D26EDFF0 +Output = FDF0C7BDF2535A7645CA9462EA039A6D06BE + +OutputLen = 18 +Salt = 8154B815F99CDD9C91DDA48FDC723EFF721438C37455035C754DC1FB7800C9231232E0A363D64F73EFA216B1CFCFDE5231D68B7165446B89AB18DAF540454CF55F0F667ABE4BCEAFB2548B68F00C25D5B812B1B646A79BCEC63D0B98074F706266C3E40B9B4F7B031DE22CC7ABAE002DA880BD8042B4DA84C456A22CAFF90EE4EE250CC8900F845FB666 +Secret = 3FD30632C5CFCB42B8668D7BF7811E240D787590FED319152749B3B040E737C826CA849BF63B0242D3AA962AACCA96A3 +Label = 9E2F5F2FBA273438DD86D31B +Output = B04A0236D59C4D4EE065B296B57C8C0AC5F5 + +OutputLen = 20 +Salt = C905AF1EB05C402F7E4ED024BC9883B75195B46754815E8426E95794AF7A53B99EB62C137378254E739F9565A8BD46FDFF64187CB16CA9A67148E993F0205E3CEF5CEE8617F913AA6612C1C6774D2982DE57549101A1ED9B92D78545E7B11B40B38C58B067DBE1DC2EE1ACB1D6B2EB09412A10B117001EAB5EBC5ED09FB6CA8D02AB3CB591079E53A190D0C6CC77CA2B423BDB73 +Secret = AC303E2363C55084F00C3E011F363CF5C13C0CC9905379D0714ACA76DBEDA1FC851CC78CB8EE720DCC34771FDBD7F446 +Label = 711B1D272B1C9507644376EA +Output = 7E9F0E55E09FF089A986EA9ADE5B48D15A2309BC + +OutputLen = 20 +Salt = 5BB4DA811597EEA4AD3AC9EA0814FCBFBC1703065A463584F3BBC49ABC32E28F8BE694AB5417B7EB9FDBD1F582A20BF16FCE102F221AFE02029062BA39EB5B78AA92AFEC8EA7F0EA908C939CE454730A201F5573D4C78AC5ABD37C55D829283314628BBFF62F7BF87BA28B8C866FABF0D9DF20175EF48A3D0D1E1635E7DFF41B26E7D863116C15AD60D9DFDC9E201D71C538DADF +Secret = CCB25C11DFA360BD192C818EB175C3C76A73283DF6D7869C386769F80EAC28D63700D15D19A7CB5B5BDF9FBF4187525A +Label = F2980B952FE72D590B5093E9 +Output = 8FA20ED10100EBD00B7C70D0A9E9203CAEAB1FEE + +OutputLen = 20 +Salt = 75FBBCC703C4D5F9DF67F5EA085BD7B2045F3BFA29AF6E946C01325D7B3CE59F6BD184C2C04EB20821FDB3D9D9263FC7F57F19202B27C637083F2367B9CDD8CDCC17A45E5F89E0ABDC7D8DF329D2FD867C07489A0267BB9F2149F0F79E3939D89A7D49638F30EE6E0825CED852C12AC8EB98158BDD7A02DC8C540597B2D5F01CD4D7820EFEBB324D823A83C9597DCBB09B9C2B1B +Secret = E9E8C83DA770F4F78DFCCA140F912116F63EC704F9BFF1DB35A474E69A923AC8E0AC7C36160432CA1A62A2330DAD1A39 +Label = ABA6ED181A41A5DD5680E5C8 +Output = 004006170090E730BB137914309D69C6DBC0D15F + + +[SP800-108-Feedback(SHA-512)] +OutputLen = 2 +Salt = A1BF74237FF9A58582135BFD9017A483CF65F1528BA58EAE100703CDDD3E736949E003B76354434FFB2C1BE3C9789573E4FF445494097A07517E4C56F5B62ED12DA2371C4230291DE2DD +Secret = 7475D90525595BA1A1EC2B82F7A97F647707FB90B43863A87B9950A318084610E6BAA1112A35E1361C6E50949ADC106DF4BC6F046461F267E039B8936F4CEC2F +Label = F4E1CC4EE1460911D0DCD5BE +Output = 7499 + +OutputLen = 2 +Salt = 0913C9146B66122EE7D0054A46B4E0C0128356A4BB49A0FC11CEE4F9C62C3EF6A9166442904D6EB976D59E422FE15D3DC33646DD69681FB1DFE0B96FEE9045B7193D53A60B075855B69C +Secret = C500B346DAB8AE053DFE0E3C42D5A7CBAE5D06A5A5EB5E8056877C903D631B1F60841425B0ADA3951679E9E7F0E268402E2706C0098F956E86F210207D6C6A14 +Label = 78803CD4C2B02DF4076B69F8 +Output = 8D68 + +OutputLen = 2 +Salt = 7EED28A8FFD68C8597C8742FDB6EA877DCD67B4ACAF502E49AF26B99BF229181FBC123A5468E5EAC056A0E47A5516F2D67AE540096A623499A92BDE115B02A7C6C49040F7E06BB463078 +Secret = 91DCEA1B7030656633FA0F270830098797072FBEF8A616E2DBA185D627C571FEE2273B95C6EA6595A119E95083F444635617A56DE885AD1894DA22DB95871728 +Label = D0EA2740AFD616AE30036F8D +Output = C03B + +OutputLen = 4 +Salt = EC3E62DE99C7F8C086995C9BD02EA82DE29C9E5E8D9BD4026189C60C610BB3F254CBAA932BFB1BD336773EA9440D22C34DA478312676F4F0CB029406A3F845F6D1C3127A5959DE6BC68A59FA9CA21ADF86A3525F +Secret = FCF35B0BAB350EAEE7A65F14F447302533A0EA4AB57EF385B87B405D486004478611D4942AEB67436EF20593BD568D2177C73FA605139D030E09870776646D26 +Label = 4456A6A95EAB07DC4A3C17FE +Output = 3EE27905 + +OutputLen = 4 +Salt = EF50AB975D79B7D4CF2EC59D28E62E1DB4FA557CD2EB4689F89C1D459D2BE46900EA6D75185357339928C44E50B09F342BB7DC12F14EAB1DBB027B10BE13247942519BE7C7017A774EEB1D452B42DCBE6C66554B +Secret = 3F28C232788AD5162C8B9497D6AB5BFFB0EB8D663FBE0C0A40B9F0FE4B8EACCF81EC9259F4E770D5DE2563E7E7C8BAA6CDB93DFB126D3148C792ADB2BCAAABE0 +Label = 018E77F6A6D59E762234CED8 +Output = 1F9A0C6F + +OutputLen = 4 +Salt = F6AC6D24F67D4421CA26CEC5FD79A28F1C6401BF6AC808E9F72A59E61384DD2756E124C44EAA660AF0BD9900AC7381E4A8C7FAADE2CE701B259F6162C9DACECD3E662202FF1C5C749553AE7324F9074B8556E558 +Secret = 0AC43015F8A7E95802D10E798D695E5397BF9B7C4FBF47660F45BCBBC56CB8E80C31FB9494C101D05B669837C1B61598DFA51F06E8CA703B833A68FB471D45DA +Label = 8397E912CF318C813D2BE50D +Output = 567FDC09 + +OutputLen = 6 +Salt = 6814F9E88510682DD995B851786ED7F3F0A35C47F816EFAAC84DC0049788AEBF0A8FB56D608CF2E6DDAF770CCC368BB0917BC1F86DC33AA822D84F5E544D10851FF8481188CF679F05AF594B294A05A1F6A31E1024312348215E462EFA1F +Secret = DCC8986110A301A9B97E3F6B098C8E9CA6E25458C3344CE8AA121C72C747F3BBE941209C85686F44BF8B9A7646DCD9CBB760A37871D44C8848B86D0AE77B7597 +Label = 6C8F14C1BE12EEEAA4ECE597 +Output = 8E74E56951F6 + +OutputLen = 6 +Salt = F9E397B73DE2C1B85EA4A6386B6968D6AF8069005901C2E33CE72CEE3A0DDCBF24D01B715094D5AE93269EF939FAFCD286AD8A5BB0CC21C5B3AC406EF0B1637E9617A056D111036042F3C8871AC30DF7C88646DD6A4D73AF447834FE32B0 +Secret = 4D3302A38C13FADAF7FE71A3C278775958801976B83EA8C2D625A633B7FAAC7B46FEB299820D71E39F6E6A34927FF07366B651BC5B243FCC4F6445AC49F3D4CF +Label = 1B03A9043F6DB6D1983778F6 +Output = 163A07299BB8 + +OutputLen = 6 +Salt = 8A747C9A11A9DFFE7857418DB5CAC7BAE088EF88944A0FA30E64E84F3932E45A3367D309ECBEDDB4DD401A55A04E05EDD43888E76F28E58D269E7CE83161D1CB672E0D41CB7309328B06EE72E33B0B7B627B60750E87B0D4A1A75AED834D +Secret = EC0BFF5E9FBDDB33E42E5B948A8CD0227855473EDCC72FD370EFD9E66A3952ACDB8B4EE28458F0C11705F2F3D270AD97214C4E01EE8E5EBFF8B585353529972B +Label = 9C35586247DF7E4D16BCE0E0 +Output = FA8A0B166522 + +OutputLen = 8 +Salt = F6B8CA979E1BD91C0EACFFFEAD18F072C9FD3517385CAC42DFAFF8F864F639E07095E97D21F4BB9C489BDC1544B3B605DFC9EBFAF5466576929CEC3152C453215B9EA96A0B209ECC261893F1FDCA901633A1A45C8D5CB03F78BB9609F7D6DAC94A0269160457F06B +Secret = 95C72C1C6FFF10D19A953AB91F7734DE0232F0313D1C34ADDFEFC59C677440EECFA85DF1E16FC4CE2167957480B7D35DD6DCF3BAFB081B2AA4A332818E1BC969 +Label = F1952F52CDDA5ED7B97B8024 +Output = 92230EB9DF6A1D7B + +OutputLen = 8 +Salt = F727A9D8CC77D92BED8C5DD657955F0BD575D23EE9B1A7CD83F7E22337ABC70F7BFF1A7FBCEF72C0D50178D31A3244655AB637A601B0C11F7E2F740CD0CB502EB0530104FEE3A894E93F7BD8A607720B49C4B0496F9D784CC44A7D1B528BBEBDA93F971D230C5ED1 +Secret = B65242CEC267788EDF60186B6F791CFC1BAC70483089F5E01D75DC9D2F544D220F5201721314CA75125278A6FEF13161F6F9805637A3C12D788DC3C7840FD961 +Label = 0A167B8C6DDE23CC6ABA47F1 +Output = 0D3C3DEFAF40401E + +OutputLen = 8 +Salt = C5A32E69B3D9040019E668168E664E5B4D437AC327942C8D84F5C29F39BF34A8701D37E1999BC4EF1CB507B1A5242A88C43D4C30BA1E5D1D59E74FBEB06E110C3F4FB200C6907D750A07FB72896DFBBE77E8D04ACE79F3515D4E974A500D13E52504AF4148EBE183 +Secret = 7254B31FB95AA43A1E89BF87A2FA2C1D8D118A1402DE445D02FAD0C343C1F99E26330ABA7BBF1D6D32E948BC2035AC62F4881D46B9BB941848B40316FCEC982C +Label = 82415135D7F363665445C100 +Output = 1387085EF615D4BB + +OutputLen = 10 +Salt = DC8BDC85946EFDD0E2907EFF6FEE79956D22A0B12246F4F49AF539B9A6B5A1433F8A76DB048266B826BDD168EA2B26CF2E69704BF8949B0FE0FE2BA92ED1A446C3F2BB2EB8D46957D0BD8F8F3898BB71FBE136ED02CC9289C78EF198BB95DC29AE7113F7BBE8DB401452B6BD42D242F5184E +Secret = EFC768E9135137FE7EC6168AAF9D7C5E3E5B218067D44D34281498C3232251D48549D7A0A5D9EE22B28C46E02A85D466190FF5489230FA6F8CCE3F4CE85C14CD +Label = 522151E959A7EBCCDB17057C +Output = BA0334EF62FD92941490 + +OutputLen = 10 +Salt = 6520C75A42EDB6E6296224907ECCC61E41BF5D5710545445404D9F000ED76E3633255948C768F73AEC962B733AA0EF387E99A3F3B57BF092FE1F0D0440616669920F66BA4F820C682FC78A4E0EEBE4D56B4149D849D31BA73C51B042D1D8962E634D38D98FF39D5DECD53AE94F5F18262621 +Secret = 1486327DFA4EC80FF2ACF1BC0502A3926149ECC902238D3855B3958BCE42DF74FEA1401CBA5F52B154E7D2A0E163FF07AA41A0567A934BFCF26474D5804CB878 +Label = 88A83659A9D8F487F4D43556 +Output = EFD932C8313CEBC60344 + +OutputLen = 10 +Salt = E20045041B9F6D97C0D6E56034CE1C29B9FE71E14CEE068EF81BA45A41BB896F0BB6F1B324128CF464958F3A06D261FC8A2F1997B3713ED26497E64D2935EC52AE08B5A0227519F489CE2C163D9B599F0C50296570D9404621C40AC484CC283071BB46737F542E8535B90176279EB0E601A4 +Secret = D28F08223D49786EDAFAB7F8C35B4DC7318BF4F6118A0A1EF7E6E853C18840EAAF7CBF9719F6F732447C7BD18C760CA90E88366B22D9656D650E929D3ECD4A37 +Label = 56A64CB840AA5B8D67D70DBF +Output = 8139DB0EE1F42A7CC5D6 + +OutputLen = 12 +Salt = 11C656E6106490BC32F33EC8B5E23F640A4BAB8AB935E6F847B1CC22F2907D01A3D53D5A4A1758082D825EA1E6C2302271F9BB34A4898A08B577AFBEC68DD4A7F9BE3D3AE158967FAA7D56EF168C29EA8CF062BC7DA91B5F276E666DFA4BE40EC7119299A162A4A03897DBA682930D5B3C8625FDD418DB2329CE9645 +Secret = 3173A173CBCD48248F72262C5FAFABA17A667463D8DA326DE04C069F2D08107E6305529256253D756EEDA02CAD202FB48160E6DBC7C12DBA48B8D1797D33EDB5 +Label = 23A5E416555618D5F1D76C6A +Output = 132E61A172E0FCBDFEB816D2 + +OutputLen = 12 +Salt = 488634764C5FB36273AB85B2E8154659C150C30F05D9F119752E87116913BC66F3FA2545C4285CD241C4D9D2125748DE857A154DB20B7E7F3D9D22A1F0CE7E248152FCEB9F89DA0716FC8420C9102C253FAAC2F636AD1AD37E2D15AEA21DAF42BCF29905176128F90B764EB475D5B98CA030AE55D7F8E697951F3FBB +Secret = 24BF0C085D34FCDA5502B947A33834158F3218DC06B458524C51C58BDCB55D9EF92A6FC30942334149D428ED9874DCC62CDCA38812D7DDEF112E7157B2DAACD0 +Label = D7DA9E6A698A8DFD20F3973D +Output = BBD60F8CC591E6678BF465B0 + +OutputLen = 12 +Salt = EFE23FD6F11EDE8D14612A81D77BFF96FF1A5D8FF65319F840C3406FCE76CDE4BB9384D0938D9C1B0616B4BD90C1EC4829B25E30410524C303F1519AB40246F4346135FE9B59891ECC7C5E442F30C7D37529929AF06FDF2F0F5FD6E6FF131C479955B72BDEEFB1DE09F31A43AF79CBD0AE3433375D42A666B78370EE +Secret = D69683753BB3C3DB968E1F8142B6A69752E785F4A5317A2FD41697B04EBA4F65D1E9579208D3563B667CC2510C601FBB7EADCDC8199311C3C6E3F76C7904D54D +Label = 3A78C71D0EFBA8E1E9669F69 +Output = A8018B36CB21BB9F4C0CD5FD + +OutputLen = 14 +Salt = BAC79166B550ADA95BC7786541B32F97C21A279E55F4A0A46F53F2CAD5CADE4B761619C47D57EE87AB01325BE609354F57075D78DA81C6C4771D83953CDAC4C193A5539EF8F9A85F316CB307E19590CD9FB5936DB2FAA68E24C1AB6DB6F28166FA4F9CED2D77BC42289684863AC21D2B5E60A1C728B79FE1091B2393E372175A6CA72BC45D51 +Secret = 3572E9DC4A7D0B309D5430E17D77DE04F606E7023866E517D314F315F729983E1A81B9CBB3214F2EB99D982254D450DFECB83B3C5D22235C34EDF530CAF9FE98 +Label = 62873536453783499C64FC78 +Output = 9248F1D2F9FDEFFB7891DD758C9F + +OutputLen = 14 +Salt = 53047242628704C9CA26B43E3A178303290681EA64FFEE90EB0FD4ADED1228B05E995EFEED10B8F864D7F0B912A373F5DF436B4EB878C4F743114CE6D3919293A4F6A7E422123CBD171BBB4B998B30EF9CE10FFCA44C92C3886549985A5E5E9AC5210871192CF568DBD5F4211B7FDE513BB7CE6A346E39175DCFDB6AE3CDAB1B358FDA4E7240 +Secret = 5D0DAD20E769D17151D221C03B2AF52FC70D16228B361409D6C2A41A29452DC26C5360CB44A6484C5F84126D39D0927A1EB2C70D64A73DFC79742BD980156BFE +Label = 40FA9087A48FA012B8D25529 +Output = 32D4CDB31F59DE7D1CCE86D28D58 + +OutputLen = 14 +Salt = 50870620AA8D5241753516C2D67AFA16DA447AFC3D886DB3E0D1D13C262884F7B6A4BC37E1A5B4A13BFD8DC73D757EC01C6A6716A284F4236D084C6F096F198BB3FA25E4AB89C16278C18D5A8A4A0467C51BF9FB196640DF1C0291BC8A14D02871ADE47A39604B7781AE588795F62500F19E3063B587CA3B095DA79D506333C01406CA24F208 +Secret = 93399AEA9A17707A83D2A705C3F2A3C56FE41E3346832547F8A5A0C0D050CE62FC233FB4FF98934D8E78B8D2BAC7B1B03447C058517F456359C2B67FE415DC9B +Label = AC5201499170D778B01F160A +Output = 7B2EF9D85FB6844E565E6BAFD3F5 + +OutputLen = 16 +Salt = E8A69F08FA55DCAB5EBCA21CAC386F3B1C77F28612754DA1F80A4F0FBF7AABD64332C6ED8B7A44DB64985FD42A7CFE4F728FC5CF3CCA5786394D62632CE170B2D71329DAA211696C4C6AFA471BC47CE55D9E1976E5ADFF11CD355194083A53B83497B47C652E0DF76628394291FE1DC0ED7A222366C1B601C62BEB8B046B27D588E26AB82F2A0B69FD91BD4B7B6E367B +Secret = 68B790106785E644E0DC2CB82AC5369E23DAAF7AC692286A005121D235C7412405D9985F11927B76ACABBDAF6D3679DE2845A0B1DE52987568EC712BCF86E1C1 +Label = 9250E7CF54D456F8B4874B18 +Output = D09A96AFD5039876AFC0717E8BCE3861 + +OutputLen = 16 +Salt = 56E400B8CDC678B4E778C72D8E612E2D036DAB16E6269115DCD6AFDA2F8492EC418E660C810FA23786D9C24989EEC73CE6F5803670ACB6B74CC9909C1CB39D4A3C31ED9161572CC70456FC20B51A482E78685FF7236BC1D4CF86BAF23DF4BAEBB37C22783899B6B860EC9A1257DE23A4C29179BF360F410F8E36B09E8309B6BA157C3A0A0CDA0066B09C92280EA9ABB0 +Secret = 08B37DEC7A5F6F77591C80A2CF10460D63A185EC503129F3C58E77A4ACDF613C5A93842E7A80BA6C75AE2D0BBFF284E28E9D5BD7D33CB07546CD2121C8BA46FE +Label = 2CCB5ABD59EB104306FB0214 +Output = F56BE358A40441607444442B33A132CD + +OutputLen = 16 +Salt = 71A5E5BF303BAF3CBDC64209451B9949FED1B6A7B09C8DCD78BDC490B8E939536313910EBD67CF68BA4522ABE7042B3D417564B971ADB2D61890C940E259227DD7BBBA3E30CA734EDCC98882722212786263042D1F6CBA7BDBF8830F4464E4135C3372F30140896E0828164BE0D67F81EC7FD6C1337E3FE72CE5DC9EDCAF1489C6F47C2C4446A7E8DEE3231CE4F0C7A2 +Secret = EA9157581CE7CEE0B2D8291817FC9A92ED48D3BAD2B7EF9324A0DC99E19659F7DF8585FD794521A688ED952F671CDE50505DBCF1D71E8E354C466EACBFEF96F7 +Label = 47906722187606A2D74340A0 +Output = FCEA610E7F980E3B6B26939DDAA67908 + +OutputLen = 18 +Salt = BC22F944F0AF10965A9B5708BF19D6854589EA0B3D84E330E55D058644472AC01342B51C3FB59ECD80B963AE0D725D510F4A209FCDDC6519B52FD4A1723B947D8D247B7F1EEBF3D2565F278049900B25C6F1B07342D68F2CF15040D5E4E0BDEC64BF248F89B0D344DD0346D51F6B6EB1D30BDAF58472C37E5897750D73128951CA1616E5E735BE628023C777D2841C3874A2ACC76AD479F7A5DB +Secret = 9EA8EAD380DEFDE5D6CF310F37B52BA2021B15A1B9E95F13F0ADD63D782DC28C25EBE07F4EC123EA0F75E371E97A4A2D353E4B95C018594ED21D338BE514CE53 +Label = 1D6B0A13614C6C64152652B6 +Output = 4754B81875C9DA87B1A51638B533FFE1D190 + +OutputLen = 18 +Salt = 6AE9A9A76B6F218653D05A8425041C1DB4FBA3803A5E2B2B28204EE602BB74B6609EBAA6100BC27FBB1533C5FD0068586C5D2144F86D0ABC161F057D2B6AC406B5687C8C94C794787B5CCB23B33A486728ED3CE0C83326CFD50A35CF7C2C01FC58E7711C38459FAA6A1BD8D93D7ADC9AF4CFF9CD7593F879F52AF013C699F2D1D3C5A174446F7FB6EA9A20CD1201B9A055A93245C543412992C0 +Secret = FB52CD21404E856C6E0C3B7F3B03880C5767AF199AE2EC058A108C8DC82AF6282E98BC4A73E3C79D8AA0EAE8316ABF05A44ACFACCAAF2C2C1F315725DDCE08DC +Label = 0E7977FE5B5DF0753D43505B +Output = 11494008E7D3D5E4A95D939D29BE5EFF7BA1 + +OutputLen = 18 +Salt = 4585F9129F8B0192BC78E713261D6D95F89CD658FDE60AD192B2329CC772F201360E1C3B36D5EF72BCDF466773B997B8D8EB749E0D0263C73019C6BB206C94751F62389257C5336EA83FB597D745298C0B647523DC67A0111B84AAEFF2447ED4490FE93E4A43D9D1F3CF0F1AB2C78AE0F7C7F211349C466A785E017D2C0947309D90BB63208FF3A772DD8BC06A2FF37D2A83FE476350752F39A5 +Secret = F510DC1CA5B72CD9A28A92664FB6913B5D85C8C66C808A59878668E5BF3235F5100AA13A25931B832D0B295F2E0081BCDE295898E7233C4C552F645810BC9AA8 +Label = B9C30DECDB5097CB6567E95D +Output = AD11956DBBE419DEF264F7505E84133F12EF + +OutputLen = 20 +Salt = 34E42D4FA72EAF5313309721A13A1A656FBDE6B742332D72C6186B51B2C44954D047FEF9683276170FAF5F2AE60F6C1721D0C7838D9F1CA20C4A2003999F50D007751AE828FA0A674140A6503B2876D1EA4BF08AAA981A03E873BC9AA240E59234F1E47C9138DD4F82CF6DCABBCD813020A14AC4F8FB34638D2E926D5CC2DCD58F1A545D2F09FD7CC493271FD932D492CF043FA2E48A455511E11EEC79158DED13655AB8 +Secret = 0D6742DE2D1DBE9A4635A2A21BA3CC8A890C93A01F696F1961DF3EF782D2B6F1F8C27F07BD3A0A79ED4D254BFDC23766207FB4E001454CAD72E1BD7E757A3053 +Label = 101C14207F63E59E64C50A6F +Output = 317EB7874E6447C286ED1DB13F148E8B49C84F2B + +OutputLen = 20 +Salt = EBF794C16CA7EBF378FACAC0610EC7CACCB089BE61BACDED14D6F3EF91D4502568562C5E19AB577F826C3D41A9C4547F951B84F8D5850867900C0108C33682847509392D1122500CFCCAE3F64A160454919BDAA6395BBB31216BB024A7B5920D196A3E0558B44721FE7011944C4D4F8CE303DE01061CC105FC10CEEF4B8C47153D020B56FE474F3E686A7390727F3B46D63B8E3124D4B9B037C56A900BEAA163869D881D +Secret = 9532B1B4D39587844B03DDB93253A2956CA7CB39D642A58C3878AC4F9C8C6B03A8A4BCA190C469ACA674B92B70787D9F04993386546ADDA9E74534AE78DAEC8C +Label = 942042F23AE8801A4284136D +Output = F4BB71748B8EED22C8A627BA081E25D2E8815AEB + +OutputLen = 20 +Salt = 19825F63DB8253C0A94F463151489358870BC7688F75CE54D76C1C3369556E34CA883D65A6D82BA9290A371B81B3EAB40F2B4AF8142834BACD5269CC78CB93954DA918C3B89849CAF2844531359D2B3BAAD07C2A4217C6FD1D03F88E67D9BCC10C583EAB368936892608E571D908021F7D94E28BA62416FF49AB2926E1E86DCE0350BFBFF599031F5808F6DA2E46F7B1694B34C5816A22A8090377101BBA5DE15D09210D +Secret = 44C2109F8E4773B96B82D355FEDC93F1E56280C107FBAC36A5B73ED0AF1DAD843F7D4BC5618EE68D0F9FA6CC91FCF820B055143962021E8BA51B343F5E88D52C +Label = FE0563F7E8E8C462B211FD6D +Output = CE00B7264A7BC254EF154690C5DE04C48495A3C6 + + [SP800-108-Feedback(CMAC(AES-128))] -OutputLen = 64 -Secret = e96c5574da99225f1b3a2ec160cccfb4 -Salt = 74507da3c0449bc40233db0d2e4de0828ec5d49e432398ea3bf5fb0fcd4d1928fd0c0d191d64db70a30bcc888c61d8cfb9f1c8e15e03e905cb4e49ff05d125802fb556 -Output = 064eebe2965c46ef4d3fa37447cf21f60c9bcc9e28cf3f1cac9992fda11e0d006a220664685613857ece98331f63ca84de7ffbd7e608283493f1dee412768692 - -OutputLen = 64 -Secret = 9b6529555eaee3e3ed3f6f4058da6d4a -Salt = 4abe6b3c6530075234ad57cb9ce95d3d37286744f76e02606cb9d87c64037613dbcea5113039baef8dd6310febd30468475b26875c76dde4d5fc035e304969b980dab5 -Output = 1a7ce451835ff01de7f4420808e72cb3b45142a553f33179b666e937004a3b38bd8ee82f1bceb2e20e9b42de967e9b3381239bb147d642e2f7b87e8fa8673242 - -OutputLen = 64 -Secret = 7250cbba07b308848f97aff6f447fc63 -Salt = 2bac443a57c3e8b1efd973a6ff5abddf9fcc9539a6e1f85e8c0603496b47427df227c85bd387543ed8038539346ce0df2575647778fa3e7bbcf45e88ff3f70f966e28c -Output = 6868cd0e1da7235ace953ca330bd0b62d415ea591c6c7d3fb9ece1b9b28141e4fd9683984c84e3f57acd06aae71ce0c61084cbe1375f435ed600ddb477b04609 - -OutputLen = 64 -Secret = 59ba2ad88a5214aa9b41b6aded598c9d -Salt = 099885ba53f365756b7fd9bf6ae2d140c5f09af38431cf9d76c5a0677c2bdcd2b74a503eadd177f3ed72ab17ee936b5c340275cfabbfce96e1d29ccc895a284533ee8d -Output = 2d7ffcccb851f77ec260fb635bec4c0f8254a9cc5de146fee8faea487b2afde9fe4d99bcde7a6332b70e5d780dbce570f9c0536aa58ec79cf6df5a14f08021b5 - -OutputLen = 64 -Secret = 718160081d428fa15af7126482f0ac64 -Salt = 1463e457829f095351878fb5bacf3e05cfd1811ab81f119e14a5291de1c3de6096efdf3678b7d3ae7ee0d6ff7f4770b999cfaadaf8123b8466883d5d96fd5faaf9ed51 -Output = e9cb573a04edfac7fd8b35987dd6d8c139b5ee8f37d19b3743983a7b3eace4474d806b791bf35212be04a7bd7c6f9b49c39523378acf95bcc0695d5a3ed66d58 - -OutputLen = 64 -Secret = d39b35ecd6687f087ac7819d4dcf63fd -Salt = 946634205a73186ba4e5801111036ceb8aaa8096f79db81b175dc2e590c4958f3c2b47fc34dbbab5f915c2f9f9042111d8f6a70c9fa424f4b30a77244f43a97e4a5012 -Output = 9286b4d2ecec671ea73d320f34a7fc83352496c27960fea7532ee1a9b36a301db0f2f7c8f530b25f37893abed9dd81944707e026a126ee2f95f457f7d2e46a88 - -OutputLen = 64 -Secret = cfd901004691abe808f0737efc3552e2 -Salt = 306c772c670cca4386da1c20f049b8c2b2889f4b61f19bd3b9e78b32d74745d0c1f46478ddc19fbaf2869030eaefc05a322a1499c3a49b325c9705baeffcaffb43ce4a -Output = 3eb898a3c5b926b5e6558d5bbfda7ee072a3ba53beac8f37757fdc3dd6e425a4c87fba7e34c52d7837b3e5b5ad52f3d7a201cfef7c9eed6f19c4aced5e2dd8a8 - -OutputLen = 64 -Secret = 7d836adfd58e0c82fb49fe3dafc5311f -Salt = 2090ce55f9e0a4fb4d4e654fb802ee021bb08cacfef181f1538843fd0592e4aec70f1fc89f9e1227308647cdc4c788f3e2b058447a06bb6afd65471b71dcd8f25ecb58 -Output = 67444d6210745d535202bfebaa2825d0da8c91034eeb3088cf1e4fde1c6fef64ecb6bd53702fca1a32005333eba9f4a2977969a77692b7e723b64cbf92a912c2 - -OutputLen = 64 -Secret = 86e953de881cf84cc14d63cdf60696b8 -Salt = c1878d1716d2775aabd5d8ab204399036b5b110adbff81f09677f61baab59813718c5fda94efdbee655750b3abfeb419765e7666c826178f457abd9015b359e0d8242b -Output = 48c2d2d2a6f8929235c113024d823c2235c77c8ca60d87b152a1a4858c5f22eb5dc0d225682f48f5904139e17f4045955a481e9498f84cd0d1802ab9ec14a28f - -OutputLen = 64 -Secret = 5c89e3c1576a3b5d1ef63ed83e7906ee -Salt = cc8774a7651420ce1a52dd98b7752831fe9ff129a12f0afe004ab64dbe87aad998e0a5f0ea76214934a778db932594b2c09bbe387b8ceab6da472f7086ea7ca0a68743 -Output = 03f99a05614c48fc7c2dc02edaabd404f5799f6d957bc7f7de3a39f495bccbf5cc7aceef625293189b92e956bee0777c0d784719995908b1b31db7989e6c4ea9 - -OutputLen = 256 -Secret = 11eb8baf568ad08897a8028c99df204f -Salt = 12460824e18970a517f018e42f421a66a860ce7049a8d923533fe97b61384f8def11e70969f578d6ca912c4a9259e09edb102a811d28e453c6953f3bcf0f503c282469 -Output = b129fc796402b65a2d4b69f31c059bb9fd88c4a57c56a127c0bd70867291882e62b7e97c21d9b0205e72632c700a17b13d266b27a58c6ef348ba351a5b62b2ade28adaab3e3b2afe8524a8affd12e587f5acb7983d3c54491d1de922129ebae1f35c741b67025cb53d531f834fd0397e6c7cd41456f603c080bd1bf08b5a7e69c3699eccb34f0ef12ee8af21fa9ffc2a0f8e9a43a2b531ec1d3da6b0b1bdc041e615436293d45b098eda7afc76189464dff110fb667a9166f76c37ea61e26a5a6f7ff7920bf05892d91252277bac8d2fcf5227276d935f14947739a81f4bfd3fd6b53c7550605c42aaee0928d62dadaf26f17e338e5931a74fdbfe25f73fa7d5 - -OutputLen = 256 -Secret = ae4d40ca1594f340aa3d823eababaf20 -Salt = 42df7e0bf3bfb5537dd2d644ada2f27c8cd5a6c004991771a3589d59d5cfd2908cd701d2187e7e62d7b2e513ec790fdf99567f169a897635322df7ca071691ce1a8201 -Output = 666f84bbabd0067953d1a20fab3075ffcc64d0e62c578e7b9352850c12ffed58aa568278d8a8f4dfc826c4f9fd7318c8a9271ca15606e7d1cf3f2b80dab80997f1841e495d35a2dad06bc6472c5a51198e9e56d4768e40dbe72587a0c40afd4d781f8f0ad1a96599dd87666b60f7bb78be5be3b8d38ce2009efad39e1c635c05c21211ae746aecf8c9d251b6b69ad57049fc08bbdf4e84fde4d78578a076a3bfced9caed83a35f5a3f17e2f205e57f2d11a125c908cbb31290f729bf3fd39a1efd1e04560630fd8739d0b8cb195ec2bb2394ecb70c4675d22f413b88adeed82645399d06ac485f89db5bfa9835c747c8f007f51a55a5d87306ebf8ca8ab332a1 - -OutputLen = 256 -Secret = 3a79b625a04907ab0631012873bff7dd -Salt = 931aa40a292615d8c727c626ad472de10f8c9ddf3ae835d294acc632fe37c64dc913f16708762ed064556d21e1473217bab9a073314cab2240c11f28a3ccffb48e0711 -Output = 9617ed12ebbf7ed23d05fe6845c138d1ba4ea97cea742e2c57152676565a1cbb94bcbd0c0648f2151ab40f8f1e57fb7ed80d67fc97b0fb17b1a66533f749089b50b4d71f736a1d6cdbd0025d891dfaa5dbdc60747f0b77e2b00833bcd59ce814dee295819980e88e7c28afb3d7eb134d31dbc59e9ebbec816688b34da4ab3404cc4641c2f227d6eb78df3c7162ae794983775325f3555d73a5e1549b1e297baef085b520204af0c0729d771f8e0ac25159fde0431f5d9a7ade0c9ff314201799a2e317221ac5cd11325d15beaf90998a79c7f5a4061a994dea1b109c754e8ba9a9545aafe2af1832daaad7f630ea398b1ad1a8258893c3b4728b8ac9a4f0f46a - -OutputLen = 256 -Secret = e33856064f6e7187be1601cb73e739f7 -Salt = c3dc32bf50465a3f7c144206997944fbd6715566a4922ba188591ddd8c9e555294556032a6013db0a3ff60f3210495df4834ffbb0768c68d2ab6384fcdf3839a8f5966 -Output = d6546b144538ec164c30d6435f428009d4acb4adb549cf93ecb6750cec69e3c36d6af1fff500d812ebb8c569b6e0e8c733131dc5cf066b10b32772bc50f32f130731a46b148e9f46d5deb88f0a7568999d0c6130791cb9f9327d04184624b11ebb47257dcc1cdac5761aa0e350955df6228a34504495d0464795ba11f674285b67b3a3a1c05165a997a8b61cb85a0c35fb59353cd2e8c35a1b6917915cf24e7114ca4241c9d8079c82637a225798a175a88f02b9a4fe1a273c1ecca7f1802ba9558af53c083dcb20c6e2a7b120cfdd71eab45067b91acb2f9899d8c4cc9f12ee7e5cc8df8dff11584b2735cacaffd3b7b34fee2cef2c1d2cb2719784951fe865 - -OutputLen = 256 -Secret = fd4b67093edd47a827674f93623707a6 -Salt = 20d928ce8daf4cd30caf78f149dc2f97f8f5bebfe361ae369250df4dd4c5482348af3a2724c70a3691c09c21a0083b673d144a121f044f81d299c48dd130f93e42e523 -Output = bf1cff083e8295cee8d68ae27d27f65a28a88372c1072c21dca0d3ecfd265e8c40404fa091b7e6861dc1b2c60d68637beacd0252b5b14e6a5efb5606551a7406571118afc4fb52475d2288ef9b0145813a77733fa962bd32c8730f21e2dc03b4531eece0b34ce2761e38340b2dea1029ed70634a0b58664ffa310514406f1cc8f1f63ea59fe8d3db0b33fa34d99b8a85b8a73625aec569034375e9d5b82b3d67cc59f01e99144db942a1fde30530eb3d9231f77b68bd9baa57caec871b4db640c2212ceee255021526c8b2f69c8278586d3c4bd9fc433b1f28996266f7e98ce78b1100ed164bd8c50f2d820e2af3110bd2df2a141fc31a448e26b258481f3d55 - -OutputLen = 256 -Secret = aa2672dd345b338bf67af715c6323432 -Salt = 766bd334b8b91fd79cae769d9342c94bb0dcf68d597c0493cc93627cf905c2f42cb50a94a971758c9d6a66dbae552ce550f9dc644bfd52512b7025cd52bf68c2fdcbfe -Output = 5874591e50228502ee4f9f8850e5d033d898d6f93976772892620b55fc846b6f8b02d07cd6c8e3d88bfb3af0d78fb21d7de2adf96b4ced3b56570cfe5412af6a39495b39b4820d88d4d52bc109b3c186c520ee9965d0e91ea18521f292770771c016edae98a402e6a4a524bfd4619590bfe418fbad8eb85cf3444954a71eaa0c354180af12ecbb63e501717ebf950079641c28d253a18839739fa375cad3fb7a9d97fcfe67db7db890c421a88c3c8535395e820de5c1ab57e520714b4566da365209bcf81adf025447be0c1b52e4ac7930302226cd3cf1c0c10114152665f33d17fb2afd0f0a6dc00ab9735705fadda84251e93764a838963dac5a8d3c3ccf63 - -OutputLen = 256 -Secret = 40f492cbe55151c9d11d4175b8231985 -Salt = 75a2fc32c1c199d3d503fa6523f3e17e0c2b9453abce12fbe24e7ab7ea4d40d4b2349670202a0a24a0050c0125a8dd4e2d7e03612bdaa25a9609351c11f73f761e6f47 -Output = 461e673565e22f6ef724b87b6f805be31d06a369c560ee244bdb4819c96a45ffbf6cb99139757ae8be372baedc076b39ca61fe3edb0bca562fdaef8034e5c593e689b2067122db52307f937f9dbc9f2037d9eaae36050f054f226327f20fc6074c16508bb51534569c88d1aac519b3650f00cd8d801e424a43aa32241445aab2cec1a7624bca1398a81c67366b6200e78b3060ca263ac13528cbe85e818d37f2052f0d67e76d9e9c461561eb151f4510f527edb29ba9a61d32dbc027185f30ec3305c4680164aac704901c3064e0dd869f08230711861c4d220851bdeb1c913ec1d75434432669b2f6bf40535b70d81dacc7c820f653febaddd931118cbfb1a4 - -OutputLen = 256 -Secret = ec07cd305b218e342a37bc147c07d2d4 -Salt = e7f193d4af0809ef31a452f54a93ce78cdcbb59e74b7f18db7a1c10142acee62facdc98b561ccb1b79dc7fe9b2cae41e358934a86d560e68404d3e58ac648941d1df90 -Output = d043a002587d438b495d3436025274db619113883bc409c705f505a78197312ca6bf2cd453e694f57607223a9e60c718ebdd41d286efbd57b522b1f04498f3c49c02ac3d0cd111e61e80a14adadfb884dea72ab5d39d987ba0841ace0a79e562426ad2929a2d95fc9ab7a3ca6f51df92561a40e3d21e045a372ddba753bb021d48b91c1f456188a45e306e7071edcd0212eb0b3147bdbb33ba919d414ae900a4e22f3c2a41389a271cb6d2a30ac1916f63073dccc0aa0107fff9fb158f069ad79a862bfaa1b178afb2f9e63efc8461a65f087977d2bf2b129d188261188c24ae61c655279de3547d11b0027b195d2b4177963c86737a005eeacaae02c1836272 - -OutputLen = 256 -Secret = 90ec5a6da90ca1e97b974660b732f17d -Salt = 0ac76dceb897eb04195435b7dbe3e7183b812d61579d66a5faba0ea351a89c558c82e31b8ad03cc6c983bda397fef3bc575599982bf16d98196bb6691af9ed30908583 -Output = 79edfe5bdc5ea2af32502b997dadedf41b70c56a7b1b51589afe8e45fe3e2895b823c8f940888e87456b146e155c034d68ce82311624ac3d32426c4ade8d21563690ed1ce075618672c755f8139ffb62a5d07b918b094edfa8959f9aebdcf84b0876ca9102fd8a2f146e6ad0168ddedaddca27314d0880472faaa780c8160814229aa43fca562271af6edbee7ccb2db27bb0a3762c244ed7826d173d88c318d356b311cc9cbf74b0903570c6c758d54d66868416422f07a792cb0330a31cdcd9d67b64ddfc1bb42140d166e3fc7ff61067f1eb415c56c6aa8390a49076a05b5d5af0ea4e33b5211e98093ae3656e662e976dbfdfba5677c40894f193daea8ba3 - -OutputLen = 256 -Secret = 1cd301b28b05272b4da1aead5ce4ee3f -Salt = 1099080caffe43324177b17720e8bf5d9c43c1a31089aa49be776d38bb862ea9773312d048569680a3f526d8e8e456ddc794954053eae148abd5038126d5ec4298da5b -Output = 00219f662c940bc4c564b981500485ead24284346a0012c62ada9342514039f51b40966d9d62e8cc6c13651538858325c1f800f28d5ac17afcc385078795d7a852c89ac389cd5f246be5288196cc5da204b5a11bfdd2c5d1c1662a33165b74b69aca1c0fbefc2360798fd490d1fc4efa5d5cf647b612d7b1d1d024652b2dcbe14b8d01b6f5158370bc9bc5cecad3ef5263c5b7d954d0ef362a0cfa05328ac2c4073d9d98ea9e85bcde4a991e81d5906e6f1147cbb2fab7eb0bbdd6dd70015bdd05d314f72255277171e897c6e559f409d5dad02ffcbb4bf8e7b32cf3a49eb2b699f74c920276d3b61e58c6429d964ef331b033cdf11c10c0741e1a7086d12a22 - -OutputLen = 70 -Secret = 50acc22f30dc083281836015d6f59d0d -Salt = d7209e0a1110c9b91fb74d9cd4eb2feb374c21075d62ad639edbbeeb3a57ac5b1acd8511cda4454728db5bf368888db5b239acfcf52a5dd532e495d6c7cb25a70d87ab -Output = 76a0e6d68ab14f69c59c89e33fe4fe30a55e1e1accf80b58ed1a3ca9edf35c689043419769c5e3b415f8caf4aad49eabb5ec1530303a5ae795ba5ddf923e1f2d74a1dc15ee35 - -OutputLen = 70 -Secret = 893ba65e43c850a7b39f9718f7af79ec -Salt = a28082f2d46aead266758225cf636adff13053b6c92057cc6b2c1f2fdbeee45c869bd03a51971e46b976ea71fa688e98b492c37e2aac758461d68e7f0e3332e2e47a67 -Output = 71b136ed7ad687d41bfed5c101d62b6d0965d85e1e7a21b46b9af1ec264e428bc23fd0a3a5e7699b676d5fefa247b6dc34511fe99d7e1151b85d2c5ea0a6ea7bb1539d504893 - -OutputLen = 70 -Secret = a83e3d9d759f129c1e9b666c6e757940 -Salt = e34609c75265e22330c395c4df01387a1e977a2ed14e3a34a6e4723b15fa2ae06dcab1865b6065eb6ac8dd2c19d2303476e5c4c1dee9d5732a3ca17fb8426467fdd3c3 -Output = b0c29228607430ecdce827f468d1396e4f10c5fb516f2cfb4b814787417493f0968db85ffee4e77f13c832e5cc53dcdf6b84088fb8109726f11525e06fc730f96da2b347c77e - -OutputLen = 70 -Secret = 430a635f12a82665630ee07398234b3b -Salt = de71f576626bb20bdb2a1be5c4e62922046e72ac74d1c0342a1c4f0c83e968ec1ff048fbcd5e1fee21db15c70d9691a46699ca8adc7f7fd46a36de7549dc6e50c66e29 -Output = f6c9316271f82aecb820c57690e73c906692c6c12b8b1e3393c3d6bc12f01bac74755d96ee3c3b396892a21dd039d3cf0af56ef4b27a682fef77f30c56de9113d553edf44291 - -OutputLen = 70 -Secret = 29e78f18a749479510e617d0369de9b7 -Salt = 5091a269d68e6c1cfb71d11d364f0929864a5bfa54e2a86e2e1d552325443fe754d0b7bd328b8c2c84e0a73dac4b918d951fcbd5b6b384605deeda35a39988c25722a2 -Output = 3faf24e05c46d545880b7146629ec6c167e34dcf5005a4ec9c973cdce4e59fa7c6aec60a6a052a2bc6fedf3285ceb92af041235fb006014e1c92d4e50c7baa77321ff12ce27a - -OutputLen = 70 -Secret = 1023fb13df24670c3fac7d9e051264be -Salt = a9d244370b2842387e6457d68aa95196d0ade97b2707bf8f3286e9777fc4060dd218ec49ca79f17d15f2db77afcafe0ea560f14b12abf21c33505792a1076a1ed22338 -Output = 37a8ec87d440ea9a3a14007854ba4ff74dadb07418a34aaeda383eab1ae2b647f5eccf189ba94a8a6e7ca5e6a21f974e3c46c5b1c973e5d5482143aca71cb57704edffa036ba - -OutputLen = 70 -Secret = 4058ffd4f3e6acbb68226c26501e7e55 -Salt = 7539c0f45b6b460222a9f54e5ba0c618a4f8271aa85d7d85536bc7c7f25ec087be988ff7e6c7eed05096b4f2ebbfbe39336193958854702df1089c7a8b7018f7369c28 -Output = d1c327dcb3e165d17e56d91d0be9532d9268a6f6d26712c32a0d6ec125f62b0efd8dfa37ac940f42eb91c6d9ce9fc700bc11c50859b8667b38fad74d3f0da67fa5236ebca5dc - -OutputLen = 70 -Secret = 0a7b458bb13a0eea706396a6e947b4c3 -Salt = 914c259535ca915752d611a8443d7f80fe7c5b2547bfdd3007601e94f626935ccc76f6187895be42d0b80f7d35dde9b22e583049be5ddc3bc4760bf21cd4e952190357 -Output = a6668badd6f0b2e62240325bfdb6d9921081e5d672e05bc25c21eddb0c93e13f1a5534dc629e88e83aac23ee51208edb634cf109a40f1b23a0f93cc6d68420a08410479478ad - -OutputLen = 70 -Secret = 0dfd94ee9f6e4aa9d9a2726bee44ab4b -Salt = 056f94d80973dadc5b9f9ae27789a3875fee2d6243a4bccd9638d7cd31c38646e3a2424f2a197e3af1981c5e9c249641372b38a73daa1679d29fe9a93e599f7a3543ba -Output = 73c71088438c7653d84facd8dcdf8855e8fd4a73e75d570dfebe3ba89a52c645c88a82453be4ed1acc7506a99a12e774005282f999ea914367393279767fa5c516acba4df75f - -OutputLen = 70 -Secret = abc062b5f5ef030c7897dd4e864bc06f -Salt = fe45807eeaf066a107306afd09545589f0e6429048dc51dab241e870a89c9c8f4637bd557bb1f739e8dd37a4a701f03cb3e67b968655a50018c17073a9272b201b7ba8 -Output = 653ae5c57aa2108711bcb9b479179117303ab0d5f0ea83ea1b44e3694dafb99b3555ba3ae1b1918dd85c16df54a5d01d032a56cc78d3fa5894dd0e236bd9171f77210d1811a0 - -OutputLen = 300 -Secret = 369ed5c8e43e4f535e73266406b2ff60 -Salt = 5f5553703b4ca59084ae28b39b86c7d077b75066828889db253f705ee1e3d03d0502971a8caee92d070fff6f1d5066d0fa077bbbc98f7c69aad208bb32778ba6140ef2 -Output = 6400296629cb46a85b38b454be0748238e7b2b976c2f0ea32fbdbc8afece29aadd3981b1132421a86cee75c7a2561c17f1a4e4dbae94fe64c3926893330f204fd9ea788d6d331a5dcec3d6dce367ac65671595e5b56895b1913213fa80af2c3b63eb8a6924e1d0a5c36df68d0dc5c4740f63e058721793050294a5e122e17f9ae717b58e0895559d5dcbeaeda09d68244780cc516c6ed23968ebb1fb305d23749b3170a3d26288e00efda2235625d753bdf0dc3eb6401288d6e871122fefc74a7dc7f1caf255da24bf604c62c11fe87a8aed84bb939368d5dfb2f39357152b13fa7a95f62872252ed6ca376b4300dc2a0f46a44449f2c0ffb9f9a87740959c067b8892e4fe301ef7c6395ca6e5c7e79db0bd8a42240aecaf0858d03c3149f56b2b431d5ffaf32da10e3e937a - -OutputLen = 300 -Secret = 2e9de4b00cbf03d55fbc6a645555f842 -Salt = 42af28b5a5e053fb28c12a4edd4358b510dfbfc85a268addb7dcc1f2167ff7b40e4ecf8f10969d82007a44355d1a30eead41e846a5cb12fb7e2b6e3495a7e2f44006c2 -Output = 54940d9a11548052a6d554b62a4f63419b3cc2d36e6dc569a1aa990952875172470855e5e68a5d512a577b28a1fac39f616922877f1311063eacfadc3e2f5294dc4396207a34acd0cf6a7c377a81b3c1307ce9fa3ffbe024f79bd55a7b6e2ea26a51aca7d9740640e2a2feeb734e963d689affb1e080f125bbd5c72e688816ba87ccff5d4c7595b764add057e7f17a23b2f5a8157858de1cf562fefbf3145421a3eeb8918bc448f30df346b4ff4c0c37c6f70efe59955607468d819e48411156031cb2358c7829810b3ace6c1af0378e5cee13e7e0f095fae545f077343f6e3b70806cfc6fb138e58a13b82c7956844c3f30e5d1616903bab53d3e20e983aabe3c8b92d2730079ab6f73c6601512836d5f9cc5bb050ab0aa0f10a259f67f07eb5dc5c2608065e0c48abb3bad - -OutputLen = 300 -Secret = 15dc7e459b15c47dca61a61b2742d0c7 -Salt = 46ba6452d27dea121de72eb6d70dad6ab6cb139492e0b099f99afa310b54575df1e66614c39b4ac456267665def91f762b7e15b995967068de4b53e01a71cd1b3a1b9c -Output = 2cb9d570e2a3bdc2064b72b112459ba89d191cd98cd2b198bcbd367d0132ea1944df99a011e4b51b744c7bf15f56b6daee91ad286e3dbf19d798a76a1731c82c5c379c5157685a3c41d1dd045b35e8761d53b9dcb39d7ea72052b8c0283157718cac2d9df96a5eea9a3267ce4939c05c43480aef100514d055208f16b04fdcdfb0bac487eb60bcd38ce5586e09c2d1f8533dc6ecde1afee4b4963388994d6248b76039813e9c291f875876ea56de8f9e0dc548d45884621d4544056c805a5c44a14c4981bde8636a67507c96cdd17fcb131d92e902146220a62ad94fa30f9ba77417b469628ac6e1fb049656b5eb02ee4910d8f775c1196ec262e1b1fa1ed416cd5b414ba967b8a09c2a1937d90cb13e3b5ce39fc422fd9facb177d51f9fc53d3660270f93d840157f253b4d - -OutputLen = 300 -Secret = 8ee28daa55a704ca7f7ba23d6b42bb5d -Salt = 808d1b0272cafbbcfaa390988db380f7e01072850a920e9cc5fb98f1fb075f5160b9bca570a1ce4fdd96256d4c6ffa5a79f9e3548aad8ed0ecb9f23a0a767554a63139 -Output = 3fc8d1bf528b07e3b4e7742222e94e0a2955a85df64992590724e22a7993bd7907f77dd67474cc29eb946ac8d7cbc4e7da304c4faa34bf03f27d9df65ae577e77c7461181fc73ffec2d60111cc2def0da84724f6a6aeb4e30e590c09ca572b6778ad303085db17405238b0b56749edb0bb647ac49582d09601f5bfe67d8911d52888f40bd2ff45d535dc6e3bf0832cc23c89d9bf27d651119f376eb473f1fdad9cf2b36f6e5911db924e83d204123e6c887fb58c1bb5e37b6495e1bdf4edfb1dccc05de4a47c1f8e4c3f5802ad213941cd8b0571a807d0f42829b3ae5bfbb85b01944d21b83d71867c318fb20016a807103993075880163b415b50889e043646cad25fffe6468a68624bed1c6815f494692c4b817ea530b6fa19fff708b04711bd935ece38538b93d4ecb9a4 - -OutputLen = 300 -Secret = 243f6a7ff4b432718326c74b0289c365 -Salt = cc06a4059b6af198581c05fff575927140eb193530790ec440c48c326d7af318c8eb2b556d8e35f0af5170ca15a79fd709724c73656958e44f30ddbffdb07c9826bbc9 -Output = 3a984e8b4cf6e0199d1f3e660e7581a9b52a536701c7020962fc1491962c1143d6f02a0294417c009c57678b173b6893f7791c87a7c9d87a550ce82e3fa288bbc4981d443ab0661c8cc559a9efd71b3dc1d7f277fcdd472f7abdb78e5e67a9268d361bf186337897d921857dcd56b731dff29e2325da5dcbcc076d5eee206d6f0c7d54941564ae8d673730f9e05f125eaa4893458f34307b58c60023b5a3748cf8f9b49236187cc9abf93b9de1f466049a4b65be13c96252e74888b27ae94b9a6fb14092ec637749764df4ab0d1c51b0604cb3c441cb08ca6a484dcc0293edc434d8ced9bd709ae60234af39e2af85cc99343c597c2f68ae2b8b9c3b479b9955020b57771530276b2f545acc5ec825cb782466dd5815dadfea767db3819a80f5b1f74d408d7fdac60acc24b4 - -OutputLen = 300 -Secret = e080982a815660723f6c1d10e05365fd -Salt = 4abfae67c94e508ddf3297bb9b9678a4f1a17a68c109599cfdf7f658f688f6af8967f0abe01fef72a3d4e23401074ee7ce515fb6b13a855221876dcfc89941a0d0e795 -Output = 1cd5d5ebe8dce11ecd036d57b16a9b6749b525b8accc240503b50d5c2c0ad41de94ae3f902829c3b6a19a44f10d4a45ecb0d8fdab0d5f1121de7ee4d258893f718b5a32cd09022c777bac24460b81770b6e1eea0c8caac2cdef350ad6dac28671548f86695c3a210fea3e8dc91b5390aeae3fff562fdbb9c518d1f27f047ba2f83bb673b0ab0d98a95c87e7c927524eb3610bd97718464517b3eb1664c52e64796766cc095038eabd81cc48511f9d940a734aff559a9a169802bde7f791938313988bb496fb9188ac92070cf6cb8937891dac6bdde0588a5d04a1bf83ed8e144d28bfe830ceb680382ea4af7d9ddd63c983fecca0b9947924fcaa686e86b725e741bbe756a8d16f803f5865ed83a062cdcdb58079d7d9f94611184bd028a0d0aa9cffc0b5713c65469159831 - -OutputLen = 300 -Secret = bf9050ed18d6197eee2d01cc4c0d9ef7 -Salt = 3de4cd7eef63e19bf426da9dcd6a06b8096549e112b132da3582140bc051ca32d1ba3b8b61a952ab38a5478a6b9c24cd703361b94996a7438dbfc531729bfde740799f -Output = e39f77d2a04f62361d53f6acf8274bc83c4a8c9c4cb144df2dbfbaa62aee8690399151f69cfc1b4da9cc556177b92c6c5d329c6d220f82cbffa1ec0e3c51d165a8c9963eff65e26eb172a5facaedc6208ac5666cd2730aa4e1636edf6403b40bc762e9d50296fc61a7626eb0ab48176ba5e91d3e268bfacc3ff2319fe8c2224c8a4d7c3a7a422910aaadd2d9412accd4967d55e91c52a45f6e277499c00d9d7b27844845cde32e37c12bcfdb93cc085d3423cff09c238b82b2fb841c334e0411ad3351b9cf96b1905b40414204bdb5364481d1494074bc1379e1e8d070356d4180e39d44f48d5005952373161b0ba3a70494d378ee23944abe6657cf5a197c203cd849bc0773f85fa07929636661fcef4688abf3836aeff293f51a6a1d8ad7476f9eb2f6950b783191055e9d - -OutputLen = 300 -Secret = 79b13b0d01335e9bed07df21321a1faf -Salt = 76ce01021a1ba3c6c81698ff727db0d6fffcd538935e9f62866a4dc5984edfc87ac0cadd6fc3174286643d8c97ee455090f77833daef058255f78bf5dc5d5dca2299d0 -Output = 86520f236f7738ef19c1122694322c450f67d20a9d99c668770dffe6df7265ffdde836b406aa14c5820d612326e6728ee71f8d25cb462438edc11081a329ee888c11fe4dfeb56722754f7a4ddccfe601f2b1726bc560f1d0f26a9508a0318cbf8a8e5f3516183025993514f4cf46851ee41ecb91307b2ab266cc43bbe3a4f0e242b98280c377e007e04e2812683d41ea8422f3a8c30411be44fa4f648c46f16c25eb418fda2a6b22c90d77d842bff0b93fd843cabbc9649669f6e79ce6497214665f9ad49f4c62a1720be0b68d79069919ad4b8034f2c9d4f8548028ccde88c5ad8945ba35b01a7bc37e53784383d367cf4c0501e9a712a433e2b1288e6c4a2ebb08e929ae7681c6e36d262475f66db5e772a573c4f782f3a65d11db946ddf2a4e3c830ff2c03a11abefc2ce - -OutputLen = 300 -Secret = 589487145630009942953111e6646d79 -Salt = 80df748648d033856182f5469826a416c41820db1dad0c57e5020b61269c02118fea44e0f8a7110533bfb11225c9ff439b6480d4dd13bc6bc75385b132b3fe465dcf43 -Output = 24e7dbfa02492adc0fc8e7d478663bbfe5df6d1a30f688b9e9e33e824b92f99c7a143e9a9f446d656d25b84fd3729593594bcd80b232640dd4bf8c78f1d2c14a2a83878d522afc853a9fd3534992d2fd81bde08837fd8b9e50b6ddeac7282dbdd11b644c24a83ea341b7f5abaac54daaf9904db08174ccf96adc9b366e76acdd48459a00dceee0b356d71e3bfe73a7b61d9f73eb8c3c61d90fd89e68a807bea01ec42f3f400bad6009a58a73db2146f244c342cddd5c2e20a27d9a922c6ba47fadb4bb1508fde44157c74ef0917494ffff4eb867037957fa2651cb09ceb9d1b77aa86a5a914c1747796c8c9357d23ad6a59f6646c5e45d33ffbcaf4bf8c3ac91d10b535de7ad271349682d63c3b5c3f2e5c4cc9fa43a0f4bc69fc4bc34a72f21818a888306ff5d635863733e - -OutputLen = 300 -Secret = 86db7c92a6997bf50d594329a4c116f2 -Salt = 19b16a433a73823995ce72500d8163fdb09af6a81075bd8372bed23937e66571a3cea2f2882bf79281058c74ec79aab29d2c79a570783886dc8b558bce020c5654bca8 -Output = 363802b7990b635155b21c202df505f590c3e9969983fffef8defc7d1a9eb498e1ed10f3d38742cf39f2d504683fb86df98c42c40fe070cc6fa24c0c937308af745c4f18b7a6a385629d78fca96f8149c2a4f8f5139561a88bbbf50d54ad873ed47960efba41cf8336a85508c5a2629e35075706b22552b4f7f68c70af609538af9da2c3f35548be5ba58e79700b499b12855319f7bfb0d6b511ded69575e2c31d2c09e15b1619196f790cb7018faa92bd133427b43752a139c8f0ad9034c501f38a9a34887d9e0a31f5db011602e3a0fc50515fa77d0fd09a17f148243a5cca4800744e8c0444cf6e1efb4a10aab86d3b9e68c700b2a1b330be490b6841617dbee0f0bba0d8fdc06b36c04d3111da27a1b34556d7652114c7517f0a2636d39fc6df36b4c6edeb36f2341d3f +OutputLen = 2 +Salt = DD14C793E9618CC9B9C01D51C100E9FBB135368D71EC55161ED3 +Secret = 7C51100737231369C790AEB3296DC944 +Label = 3CD7544C256430D3C85F81C0 +Output = 68CF + +OutputLen = 2 +Salt = F2C9B527C74493E2531281A378F00F689C010FF2DC606ED1872D +Secret = 7B6FB1C5064468F453A5863E12867ACD +Label = 34CC4E143FD61B26A9EFBDDB +Output = C7A5 + +OutputLen = 2 +Salt = C6F853C32AAF2CAF40773754BEF84A4118E10B6DBC1ED9C9907A +Secret = 1315BD8E37250F5F376C28F9B3C4C461 +Label = B9B47E64E611BB18D6801827 +Output = 52E0 + +OutputLen = 4 +Salt = FBBD79287968BAF49632185C440CC697E9E8887047DD6B53D2709F95F78868115AD7E78E +Secret = 8BA82D25D71AA608B67ED53C43144DB5 +Label = 8FA77539E489B483A054D139 +Output = 3C537CE6 + +OutputLen = 4 +Salt = E1991FC5371C95A42E08E208016F3D55161AEC6ED4AC7FF9F86BEDFA239A99BE71EE4847 +Secret = 06703BCAB9BF955ACBC6955A85041896 +Label = 70FF7071AD1F6419F1627EF5 +Output = 794E0507 + +OutputLen = 4 +Salt = 4E46D9E2A83013C925705B5C8081337BB5D241D382B1C0B05E9A0649845D3240D2E298FC +Secret = 1C5E8F5AEA2D482543302955BE1862C3 +Label = 5A2A3EFECD922C6D20124D90 +Output = E14E937E + +OutputLen = 6 +Salt = F311F466D110ACA4DCAB887B547A28B7D5CFEAB2BB7AD41BAFBEC02804CB445F10DB3618DC5C5C646E00600300A7 +Secret = A98C685DA97E592A6EBD72649D43E9A8 +Label = 85444A9617113CBFD91205F2 +Output = DCE97429FFB3 + +OutputLen = 6 +Salt = 754A73BB6B56C27559CC22C86A7CD4B9DD092E4613AF29951FD20222A40921FC0271DEE1FB1514F35BD97D08A1AB +Secret = C2E0A358FC223EBE7FD41CA8590F2CA2 +Label = 8BB897B576A2257C5C02AFBC +Output = EDF1D86B97EA + +OutputLen = 6 +Salt = 0C3414512A9AA5CBCC5304EE56501A6A8396428C428B61C785259DBF4D6A21FF1552F9F1F19905BEEB593E871B2D +Secret = 345B7E093D79B3228FDC8C584C36291B +Label = 08B16453E2AE407927ADFD02 +Output = 0EDDBD83893C + +OutputLen = 8 +Salt = 7552EFECC668395E2BC01D4B7B03C891DA08A5BBB33AB95A63797F0DE69169811CC85E61ACB221C493D47D3AFBBD680D2A0B056072AE65B4 +Secret = 3999020E2409BC809F68844FDBB9C62E +Label = CED726DDD5CE071981541622 +Output = BB18D0E5B5241A57 + +OutputLen = 8 +Salt = B2436ED79659694568EF57D15DF884BACFAFD3F28C5984B5304EF9BCBAE05EBB728610F8AECD2F2D06EB26C85619F3CB6299A1E4EEE3F7B1 +Secret = 85A09541FB7E7B3D7DD22DC36427D466 +Label = 36F162A61CD2B39A001B07C6 +Output = 1FC49B82088C2563 + +OutputLen = 8 +Salt = 7E5DD68490D7140A368CD4251BBA1B445ED3210978101B6316691E0CB2B0A83F31DE4A8B70A3F8F25E03ACD58B41515AD587E2BE51C49F3C +Secret = 1DD0603C5FDC47B0A7C9DDE6A8654AB2 +Label = EB3F56CEE69CD11EA2B5656A +Output = 7FD52E0E0C1943E6 + +OutputLen = 10 +Salt = 2892468B3869F2106441726F5AE83EFF7590E56BA49222522A0AD8CE5C9421CA6D2255F8354F50DAC1F9A63625CEB893AB012A1B52D7BA670EF1AD64404F7EEB1562 +Secret = F06D0E7225349516BFA541278B97028C +Label = 13D51EF6296B32620A3401D2 +Output = C0FE13B3ADEC9F996AD0 + +OutputLen = 10 +Salt = DFBAA0ACAF2112683EEDF55C3A4193865D9516540D11A77D366B2EE2F548FFE0EDB0A45C63EBEF69CA2E1625EA16FA545DA330E0BE0CBC1DCB65BAC7F9255CBAB619 +Secret = 5EA5CFD14104D0C8AD18BE70FCCA6617 +Label = 7F8B11EE208DA08F8D37E819 +Output = 90DCEBC93A310E2501E7 + +OutputLen = 10 +Salt = 7B7C63AF638540140618D43AC4F752C4D4A24CF534D3DB2DEC8DF07F295DC53452CA7EE0552B4E42B1CCB79F2BAB030EC97239E7F1F01BAEEF8C34BADC0C3E9D8798 +Secret = 2B515D0F8E886E44CF80293C2CE85343 +Label = 2EAAC28C145F8A48EA211D97 +Output = 469029CF52C024C684D5 + +OutputLen = 12 +Salt = A8A4817B393DC47BFBB6FBB4D52B47D9EA1CA1A2021D462ECA7453369D8D1ACDCEAAAF5295CFC603F17AC55CF8B958FD01EB41745249077CAC36E2EF172A9F6B4969917F2CB969A13FC45CDB +Secret = 30D2DE833C84A86DE6A287D5763E26C8 +Label = 6FB3952CF1B7DF0FB13A3502 +Output = F0732025CA41B8F7BA48330E + +OutputLen = 12 +Salt = B1613FB1ED9526B13732404E9CFEEDD41E3EF6E74E432655647D6E99B81B70FF790949236C8C990029931DFA072B32088BC27BBF1E5F735A2A48CDF4C26AE11036BB347E8FBF6A2F10711C02 +Secret = 2659819F042C84A7036C3856C1E82D90 +Label = 6F619BEB4567F019FB6A30EA +Output = 8BD6D45EC70AB43DBD5DEEA0 + +OutputLen = 12 +Salt = DCD7ECB0C7A5A529821DB33D6AD92A79471DDD6C4172D5850B571E6C255B7987BC472B674617FECD2A7A11A52A5D02C4A77B4C277B3EA0D3B3C3551C1B41A900CC0FBB3A10B20BFB9CAD82D4 +Secret = 592C11922B3AA511E79C30D86570CE26 +Label = 1302ED9325FFFE222A277596 +Output = D12DFDCD1222CC00B9872BCC + +OutputLen = 14 +Salt = 784D64736F416A5BCCB1DC838BE1A6EE4D4B06309E0908CED5A28557E5D5851B6AA8DBC0D17A215D84ED38FF24E51B2E2D15A100EBE81294346990330BD53E0622D64CE5F2D9ACACB5E917383D36E9269265DFDA827C +Secret = BD51ACE00AD8696BD5C0A1F211968CAE +Label = E397E628843CBE39F8AAFFC7 +Output = B4CFBF46200C355FF1A69F4232E5 + +OutputLen = 14 +Salt = 4FA04F0E3279F0673410BB07E68E1C1CBB18FE6FB675F3513F3F74233487663B1AE633A98DA3D3A02D69D2EAEFB56CBF126358C017EB9B4738E33BE9393B6AC5A7A814F3A627AFC61F8A1EEF79AEEC5BC1F2C079F204 +Secret = 3CD90AA6BA745A601A32FC1FD435F795 +Label = C70255492BE8EAB17E9F60C2 +Output = 77064833ECF20230F7F0575F4546 + +OutputLen = 14 +Salt = F2C83B967EB1C272D4221224A5C3608FBB9B112D0FEADE5C951A6556D3B2A3867E2C390292177115CEACC042F4B657BA3966C1A7A4832C7EBFF430EA113C0D2FE8F122D477D02543AF06E8D81B9590663800DF6006F6 +Secret = 98B65A2B2A5C2161126A54557C0D0097 +Label = 51E7D29DEAD6F2059A5AEA60 +Output = 04CDA0ABBA720FD52A7F7EA88065 + +OutputLen = 16 +Salt = 64F361F50C9DED2B0141701D8175A77365A654195C0EDDD7EABD2D223D39ECBEFAF7E1FBC2B31342FB66F7716D4CDA8743C9FF179335A84C0B35E86521E3978DCFA758380CBF223B87268A875E2F225D27D617B7B7DE325874921F72B2A05FA7 +Secret = 70D8D3724510D002C0561E0F45B64B9B +Label = B9DC7BAF151E41ECFFDD37AC +Output = 06C0D79E87656DAD3D98D64712D5D0B8 + +OutputLen = 16 +Salt = 0C3EDE68F6BE119FE2F12E7B62B34A191A4B2DA1E5FEE71F57DCC24E29F26EBD89455EA66B01E9CF6DD19517F720CE4D887E68279655C16FB1C5AAAF278CD0BA2269F8E314B044B04B66CD3391D1E58BCA9C14B21788CC10BD0D0831C650290B +Secret = D38BC099A9EF5265B04337E78EC4E6F2 +Label = 17CF562123C35EDB5B058BBA +Output = 989A679AEDD4FC65E2BC47A3051CFBAA + +OutputLen = 16 +Salt = A54145CC7E6CDB0E30AF990F3E037565630402FD5F81EFE392E9D3984718DA75858A20D72E29EC6F84465818B51EBB6FB00CD534DE63817FC81E46259085EFADF614CA2FDBD14E2887E863D455644564E603076074B92C685493E8FEE94B6E6C +Secret = 338D8FE331015554FE836D88D7D6BF25 +Label = B2F734257CFAED68B8A2A775 +Output = CFDABA80B956165A4136052228A72366 + +OutputLen = 18 +Salt = 3A49550EDE4191A16F6E758DED61E7DF4E0DB3B24BBD4D2AD3AA5D6C3A0B88B3AD6B70E92B1F4BB63B142BE7D61D98655A819161B605F83E377111655ABCFEEE726B52DF7C2A70F1BE32EF01459873A0A5B172DC78B01462E9550BEF645C1E16952B7A7C564B336D5220 +Secret = 2FB1D2F6787312361C71EC3DF56AF20D +Label = 544513DECF3959F9E44CD879 +Output = 9D5DA8B217FA04B694E3ED289544027E5B80 + +OutputLen = 18 +Salt = 96506FB7F541789DB3583D1BD88560AE109E5E24C325A9D4C09FD689E83AD729678E5DB92C70453C38B36A94EFB648CFEC2024CD860B6279C993BC0DC8F3431F9CB4449BE6ED01675029450B045030D164582A844835911FE68592212E8E1723A0743942484753A0281B +Secret = 583262DC295AC862E99B95959F613DC3 +Label = 77AF18CE2A17B1BB9EA0AF1E +Output = 6753BC13905C033246405983B1DD73CDBA8F + +OutputLen = 18 +Salt = 804E1224FC5423670A7A0460738283EF12D3320E9F45A739E52D44DC435DD87B4F5F4D327550B40361ADF06BA77254B9265C5D40FBF4046541147A91ED837149ACD3886F5B507F7C3EF3B3862C569E6BD131EDBA325C62C2338BD701BD4ED36EE950A8F56FA5A27B89D3 +Secret = 40F50D14ABCDB1F7CEFD80141214AD2E +Label = D36C703AB55DE6872E4EBCC7 +Output = 7475517CF0E49D1E7FD66E8DA4C84591DD56 + +OutputLen = 20 +Salt = 75851E941BB285B51552121761781C990B9BA59A0CC68A79C8EF11DF5D95DD62DED44290204A0BE9BED86A828793980C44867164DE6488498AA4EA718C66532AB1CFAF500DA470DA83FB350CF4311FD4F6BA62F9DA9B98BB8108A6E723586A572B790D6B1AFD01FAE8B5BE42CF1E4039380D1710 +Secret = 9C5A561D71CEF14D3803CD4FED97B8F2 +Label = AA49149F593BE5088D9D47F5 +Output = FC3D1C6CDCFFB56A0A587B13D36510EFB59B365B + +OutputLen = 20 +Salt = CA72BA875D2549F0DFD7A42C1789564B25F9ADA8D7B3D84FEC409EEF9F98E7BB70E81280006D7E071117F94A42C40E569DBFEA7FD7EC871705EAA70BD81F88358068D43078ED2E2F39246131977B169FF7448291E6F96A31058E5F6940054A5659A9100A5387983DDC165A709A311A10EDA69F15 +Secret = 762D485BE5F312DEEA672D37ACAB3A51 +Label = F07FA717BD8C21750610A90B +Output = C75E0ADF8DB178DF82F0534EE0DE883BF56A96BD + +OutputLen = 20 +Salt = 5B192D94B13C79BF4C71C35CBD2366F31170539021CCBC9B33C9B9E599E7E33E095714F9178EE1AE4D03E3B722B45C739FB884E8573C9E285BD2FF6B3EE1DA3A2265731A390CCC2415865C016B088FC29749B97452B7B05EA858E5D1B9A7A802B84A3A75F1A88A458D75487042CAAA3751D68C64 +Secret = F3CC2AA44C8120DD85F1DBA528023C42 +Label = 024CCD91B9A7C1EC26AC498C +Output = 67C9DB03B753241518ED298B3107A0CD2E088182 + [SP800-108-Feedback(CMAC(AES-192))] -OutputLen = 64 -Secret = 14ab129b81c4db85e397c14e9b6586b907550c2cf4c011f4 -Salt = 1adff1bc6fc7e6a58cf3a12b14bdbb3a062da98309340a1fcfeaedbde012ad6a639384c26de1ca86b9403f12ca25648aaafce123c85f3b8bed6e4af29b1887e9ea16d3 -Output = 5ff94c13164596db575eba8534788700fa0d7350bf9304daae1d8cd6111414d9434f80682008ac1d8602534da21d5ff102a287ad2a6749655ac90b97062a4cd3 - -OutputLen = 64 -Secret = c6884b3207b24da7d3d45ce8dde2f671d10e85010b078e5c -Salt = 7cb547d006a5ace783e683262cc91279d25d81ae60d803924709f421ee883cf62f23ce427e6216e0544db712f59fc561cc13165fb4911357de56804f526fbc4ec5beb8 -Output = 463b9ea21cb9f649402e890bfb9d8e298b87ff43e435531f5c69bfc9e849c1a9120e83a0ffd8ed01ea6418d3a1b428b37e3132cac53fa6773da8525d72a62c09 - -OutputLen = 64 -Secret = 856849cfac987c5034c149fde57bb2da9e0f23144a4fc015 -Salt = 4bd33073b3f8e7c8d1e19093705c79bcecd5c0470eec653b65767bd6c4882d7a90572d0c15999b8a759e4e7e409c44965fe7b616c30124c083fe984522c88e0becd7be -Output = 34d145038ce24f69896350ff9effaa955324bfdba4a9cedbfc03db26ff2d86cf1fa24ce8d2bef65e0681cb7133275d3d4d720bb107bc105bce28723199e88423 - -OutputLen = 64 -Secret = ee19f5570a2fdb454c98d5a8322f478f43807fedbc9e60fb -Salt = 9dd7f722ce56eb076e4d923ed2833eb98e199db16803222e45912e21e9fc004fd6237e826072ce6fa8079a9350fa98a39a12c94e4a456dcee3b0950c29c72cd6f871b5 -Output = 387983b76df33e85109d80bbe5d99436be39ca7145e180ebc39977a646889315fb581490641f184c3adfd8e7b663c477c435532f1f895e53eb19eb1293f36959 - -OutputLen = 64 -Secret = bbae13e87681f653c218262f05636a713af848b90c3c6278 -Salt = b823ade51f6714d4b5591cbc3b12955cce792a1cf184604b6bcd5f9cafa984fe89ca76fd01a0e8ac270a459c7533ffb264b12e851f792b2404a2d75fb12540bc5d2a88 -Output = 75b57eff06737c050eb249cf177addb2db61294e8066b9785e2985f1399df7c0762a550e5572bb2ad8f3ba37569256ee0b3bf91310860daa146676331054c0de - -OutputLen = 64 -Secret = efdc967e2f638b8653f70204a0c30f39af2c86344a3ee272 -Salt = 2f659e89a3edb3066e6402bd0e2cbc77e16f2820c0895cd61742c84693e95ea8fb488aa370bf6c94ce8c68634fc93793ac2b6f15403fd03772c0de5d349a731f2ea350 -Output = e8a06c24b8a6bf97ca78055fba5b15ad1d9a5a5b0a7cd3b292cef219ff44b124173dfd29e3d38f5bd81c2f14196e2d039ffe8d02a197667f5e807a4a153b0b09 - -OutputLen = 64 -Secret = b2a9a05ba5eddf1ff7f73919387cf303a2d7dbcd6b6b2d09 -Salt = 75ac976e8b65d2c11ca1c88e46b378f16fbead5f7c4cc0b42c127342e2116102595027524ddabd3e6f6f6604a79a2e6ad53c8350cd88a77e7bfefd260673a001855447 -Output = a2a7bf29387dcb2e9bf1fc16ff48fa7cfcf9059ed5401665f7c62a34a518a2f40146cf593813eafa1513bc31a6b1c268c17c712adc7323cce9f5156e482b84e1 - -OutputLen = 64 -Secret = 2569c4a274aef31d9a7bc31f0e9e30ca45d424ba544311fc -Salt = 6297499fb2fd3a235fda3678de7c95aa436bdc2b07414f666ef62e451d5aa1fbf58ceb38c1dbc2447a6c6db7bc364dc18f53f692ccf73b1d9bf3ffa411a4d8231d131e -Output = 6ce9fa1db7a4db4968c33c7ac3b3875b0e664037cf17061a616108b8300a455e750525bd3e41b4c0bcd4cbeaa21b0d7236f1da050a983430c117379b3aee899e - -OutputLen = 64 -Secret = b4879c6dbf7290a28aa5464312329603914e267768507bea -Salt = 151ae491186499acf402daca749afb2adce4c0dd54f6930b14954c6eab32c28e922f6d79e5f5fb8992636cc25133d7a106ad98611a7c8fa00859684daeca3422a90fd2 -Output = b9248d4256ea77f12fdaa7f043ec6feb4964f429174c77f232d2e433180a4c3393b533cf2f4d25338abddc7313353243a72d4f0738d65271f43e3525fd10257f - -OutputLen = 64 -Secret = 8d0be36e537ce0b471b888fcabad6e88da8093a61559d670 -Salt = 19ea3a42ea13af6a40ca577c6cb95dbf431aa5f3e03534d70ec51127883147d12453b54580dd6aff44a988cc5ce318d3d46029b648b99b45f04c83858842f30c2fc31a -Output = 84f5aa6c3029c4172025c09a407fb01df3d3356ae3e686b7336e77dd83bed2358f4803131133d0a28e85106f7d6318607f1305dafbca9cd7e7569496c3b9548d - -OutputLen = 256 -Secret = 4769ff6de43b757a0b0ebc743fb8790c9c20f79865a28520 -Salt = ddc9b42ac390501a89119024f8d835437b08a3d0a30845734f113ce0c044c9f67309ce80704b646c9a382d30e0cf7bf00067f80097aa22aa7bb25c4606f80782a4c78e -Output = 80faec1d8b4f439dd4fb97f23213d2ad0d8205083b68883f604eb500f78bcba55b4a897163722d67b5f86ba4648ed9d7c91bbfea7461a075362e76a2d011466a5d0c2e82c848f60ca73d132afc60528b5c4629b6be513078e3dc01315e9224d1b98bac4cca699b9f33271f65c1311439bbcdc5eccb4713bc8cebc1277dcc8df9071019475c322654dd0a1121d3b82493f5400df5a46243e12adb904d2b4985a2db048d6647f2061b7876895da29e286490d32a20128ad74e3c85252ac47c0f7f727798f9dff389da058ecc0408634942cfe9b3567f58ccdd35df055aee05014f92cbe65a1fb123617cb47fe67572815a6577b151c527a21d3f442e96f12decb6 - -OutputLen = 256 -Secret = 3bcf3d11eddae34431a2ce706e1f6e9a10d654332c53aed4 -Salt = 316363bf1a1aa5c8695a55e8d1c861df6b5002fcace0437f61dadbae7e6e8ea82db5a362d79feb0f604488f2fbc59d297abb672442bf692fd98957410ca4a1e8bb2669 -Output = 75b391b2ca9161621c43fdea0d2103f7175eda6137e54b68cc59febe2854e8f6c3e647cf8617c225f5816f75ba6292211c05005c3fdf519a1b165a0f4933eccefbf6d4f948747962441414d31c3592fa8b3fd8c83a7c728c4e931b4b776599d2685e565d5ae4b4e66c24f427e2c115dfa0f7ef3995e8df0429dbbd329263b00418d37eaca01deec385b6948fa8716bb374f8944870b211333cf24e0f2f3101200d7eebecb571e5c4e8f202458b4d3319b1fca05f366286b7a0d7a06ea961b742560f437c4b667126be297e94ca7c4e496d5dc151a5d3c427f76cf2725802ea5fab030eafb06643b08a4845ed3d7a8a5da2e9c2d6265b76cc261f1eec63c96160 - -OutputLen = 256 -Secret = 46fc6fafa5f49fc785e334b8b59fcf88226e0d12a250c5e5 -Salt = 9e67eb0240d55a9b9f796508097a603421edcf9f144a29e48fb306e9e2e0f1fa6df08a46fb46570f86a0dd8cc89724773de3d2f712dd1447efd4ffeb21ee7e2964e3dd -Output = 5927df96d31416782614c60554f79bac02dae13bda07169daf1624450102e4d00bfe5f8d31d942908c1e941c70ac948239e96a528aeb1bbc28cc73eef76385c0af7d66a1cb199f2672fbeded253f37b4c317664a52e89958fede4fcdd808f87f9bb7ae5da71a66143c7574582797e27b8c19cf4e5aa632a0b8df25721bb06259d19ffa08b082a4a3b5c568ae05f52857d832f34e9a38211c16c939e0a014cd660d10c529725c72e1fa1d7703321b88b3d19ae7a8996f93656b5c7d58c27484dfc4d9da70a733eee735419382054251a3849daefad765d6e2c5e9cdcfbe4e5fc098c60f54688c0d6a002bb295cd23f4b4af727641dcc32bf1493646cb7056d93a - -OutputLen = 256 -Secret = f580ae5896718822a6809b4ad91b0492e04f8188964a9355 -Salt = b55d44d2d0d74860e1ef07bf01a3dcf89bd64505b5dfdd07f29fe47198e9a08aa2ed8c6ac8c0bbf4b76c8dbd044923a3737e472a95b12c4a2e7d4c4f63c084347fe7ad -Output = c5d0a309b945787bff7476ecff94314eb038fa4774b8897f191209e27f8fbaecc49b7751fbea6ec349de00ee5ec2c88705523f629418ab004c09d26bf3ee7b370781bab2d33757e3890194c13272222ac94e4585b1fb6178ea74968f23efc8ab080376e49bd08b1effafcf39e3d39b2c53c46b8b5cc69af24f1f2166c34af8ae8b48c3016384bfcad8ea0f045ea5ac38bd2ed228c1f9a734a467566d44dce073b6dfa16278b91a2a26b61d202bbb061cae743b56fdb3cfefc52e24f1f9d6a0c3c0a6597823d03126cde2f2f05f9a1f10370c41d3ff8821ac9a35cf5782a0af36515388ce8e7b4dad06dabfbb727d3fc654f8bf200f21dfc36ed9a7e9e5633a15 - -OutputLen = 256 -Secret = 11151cf515f1ab469ccd8dec6e030bbd3c869b06694db587 -Salt = bb6fed2a353aef0e901cbd1ec05b54529cca64b477ea305349666bb841091ef2a9d16a5b548f8d945e1bda14258b5b8cefd626baed554ab644e9c055d9a0a7f8fac375 -Output = 919c0a38af04325bd318e82c843426baa182a1ae56adb22cde60561e22361bce696fa78d706b9f417ede8612f8bf80826b144236a3d7f9ed10f96d1b429f11ec20d7e2163c31873624cc73c20fcbdb63d5d099e52ceb3c41ed63103d3e39a2539cec2926a4bbcd918c7f76d79673e415fb32c0bf489bf22fa1dc4ec8c0198691ceea24c87beb0c2f8bf453641a8830b3e780c064578b4599c0dc46bf82fbe99d6e744c4d79077cf5ce1dd29fc6c0903242dc39827cb08ca19365dc2d3e9db2b117cdf67951786e38c0c1ddd415a6094446e5851285611d6fbec071b50e60bf29ce0afb23f96d91caf20f96d74aac0b6429176d75f692366986bec59f9652afbf - -OutputLen = 256 -Secret = 1511d3985b0a0aba237210f5cfe9e4c7bd43cd29b2f6af81 -Salt = cdec7db1d7bb5c92561d09ada9ef5b051f56ecc5d024e1dfa51f80b2f2612e2427b931d1426a8414b500bb834db0f3fae808ac079479919d0b46f8414e2a158b24c965 -Output = 2f52c30dafe4655f68b38692e7fe842ee4ff0df9e8f3581f0133e4e802dd07c9040756fe7f44747b8908ef0f56e4b84c85424b202299098b5e6e54a1a6e24830636eb7c6afb1ad81d617da7d76d2c2c39eb8280285cbf51ccc4ad9280196c0117b9a9df519b72e0ef6ca64e30fe1783119a7f7516f8a8b6e7436ce120d2fdb95e2d60de4a1b37a8d3925aab0ee255397dc4a3be7771a369792f949a5194390bab446565a06f4df2744d23e9c038e7960e99039cb8cfbd3cc877b4ecb8d592b750255a37b706ee97ef9d6b3c310aaa0e2142825ec1e3a143d5907ba508649f3798ee2efd14cd2d7110986852f387f3b6ee2514a7b56edbe8f6b7f26dc03d4695b - -OutputLen = 256 -Secret = 2a1bc7ab733cb4cf4c9a6da43f98377e9d2f2868ffa81819 -Salt = cd9b8eecbe57f5bd0484dd0f0a064339beaa00637aa5eef0656454cd45f3fb730258ac7aa51fca4de1d2534231c2bdd869ee3e70ba141c324fb41815890b62435e8805 -Output = ce5e56555eb60547ff40a15feb54e1f57f05454ffe0a27cb4fb22906fcfa3267571e6865d213ca97a45c2e2ad1ed42638eeb8b28bf9b77f3b4cf388bc5b8bcfdfd8e3dfd4a0cc0fb6cde45c0310ae91e7c0feca8e05801731d80c54e15e387cdf99b81f5d83aaddc4f96f40a64989d3dc71dcb397c650117aceca7b1b01a18b556d3d766ffc12038c2a2ffb389e3e4c5d5d561efc8c457b9cca30533d8bccd82653d4456976464c3009c0a5e7b16970b6b222609111cb7a5b081240fa035efe244b6a3f58ad5658b9abdc4a4992e404ae5ba00db49e3cee1a99083b8718fee0d76210430fc77e819df37b3895b39249277bb83d02b3493881a081e5cde008d83 - -OutputLen = 256 -Secret = cc22a672cb067354fdbc2e139e809cd04befcc09f15d3803 -Salt = 6b7687e06b888d147a2a748690db34116fe542c70db5e235b096cf452a2a3065b19dd12dd9aa0e79ee24e345071df0bb22b8a85a2789dc8903570c897c24eeac860de5 -Output = 6803cdecce809d7c248db30ee1e4306f6d0fec6a56f6903cc12757d40392dacf9f1e3eab66a13a5c3e6fa4c70e1e9d1ad0ff1ed7051ce3b6bb4c66636126a9e995851896f09651a8d908ac3b2b06ba3d047a23a5fe342f4e8a96f5b408b9a07980dc6695455ee948c40a0efd117fd7cd3acb362518c002811e79b305a935ecfb4385f38b5b714a2ae0ebf6ee3be62e8aa78cedd155359e9516abba431271ab79a174591818f2e80ec403cdb320266b4a2c054d9735954c4df6e6c17c6c37ac96e342958fab454aa335429dd9f20bea46064b9948d8d4016cdc35855cac58085479641cef256c02bfe0fa19babed6ed3d3e83db2f1f8f2e28b8bc3ed913b70c02 - -OutputLen = 256 -Secret = c68eb5aa8280994eee8ed50c9bfb73afa413b1a4c20366d8 -Salt = 46e047820b10b159ba2af2faa2c30555bc0ebadb249cf737bed190f23b73c3fd17299252b3cbdc4660a1c1ea7febb25b909248585008d050fc71f397614172699c5aa3 -Output = 63bd32e04b7416e7d8a7f28530daf4d38441b08a3575bd92b09056e8bdebf1e856d5c02da844f921aea58dc78d9396efd49d123f2b3b5f79927809f91031989d8e70d1e06e2d2cea03c9a495738188043589eef974d00e5c51f2469ab58140cfc479d0c8c88aa9bb95562822964139009a6878e38296b9c07dbcb780996174f665b6f7e6ceab0b5ee658055b48337ac878ff4afeb2772397e761a32d6db6985609a96051f41dd4c86729c057589d6d61bda0be1c6033b043e6dfd4f9983acb7d958900a013955fd372097ce01dadbd5ba508774b88a96e6b96086ab95dcc3668df8b217f80c09f369eb307ab22d4d5affaec4f531ab4babbb04f5468e1728cee - -OutputLen = 256 -Secret = 6ba5ba99376b69fcafbebef831765d7609ccd980a32e45ad -Salt = 240fdaa4999ccaa1050a588987ff960d8a900b2f08d02ef89fff9a0e3f41b8c10e1dcc8debdc36efd615f9ce269ee2a97712d4f687752d9be0f2a7e49239972a38ea67 -Output = ac608019aa69e65c52c52db9f3e3f8ecceeecd931fdbc4fee32f57e8ee87f0d5331265faf24ee36c3a79048214db5ef0247b1a46de83abb991a55f2520e7c48ed5ab694469df78fbfc5f422a37a718294a949211a34e4dc199b666d7295e508c0f1b7dac469618f460100077e0b06ee4e33f4c7bf3187b9c37576775bf22b4436b0a61a2607f0b677a3072b7751fa2c48b874e804eda3d05cb39528384874f97590ad8ff25c0cc400d2caf4efe795164d63680d72fa1aaa6ab6cd9f2d57fdee242d87acf92d87c0c8fa7fe609345e94051eda2f304b2e032cab32786fdc614c0d2db37aea6d5c2fb99144617e61d83e42064f4628adc8c038a51d85fd3d66efe - -OutputLen = 70 -Secret = 9d2d35f14a4ad4cf1929da8d7be73a89422bc0b583ed3b77 -Salt = a340db922c77450e24876308f38360eb4087e3716816b4acff258007029c14642bf360b327650aa82ce49a2c3933cd9a41db0bb5cbc87ffe96d47b27ba14458fb37201 -Output = 55f77b65b7c1eeae6efe7639fd460302e4f60e80b8f2c9296d488c69972fe9311f8af92474adc988af6294412fb2e6a3c72250ccf0ea45a127dfc0201a3473ae2d8e27c133e6 - -OutputLen = 70 -Secret = b18d43e2671eceda45240e66e67c115bcb1302bc94c76d1b -Salt = b098dfb741f784dfe7832351982e9b59b027ceda1d7ceae9fabe2ad6c02cd0989cb2ed56aae08d168febcf4247b811500432e66fb5657206afd4eb42b4e499295a1ff3 -Output = be2b6942869ed1fed5f006a347e5209411680c7099d1dec0c87e63c3e84fa78e1887055e76947b65dcf19b6a5d5d932877bc18ece54f941cad7c1000f21c2eaa1ce3f8de09fc - -OutputLen = 70 -Secret = b4f75068234c62ecdfa0479dacc8d74034fe239f80edddb7 -Salt = 8daa8777a721e20602fb6c48fe486a76221c81ff4b2c23b5122ab265faeaa599585c24901245da7b02a6a732b41f1f4d23279541310c66aa584f5144471ecc966fa927 -Output = d8925e91f4a076288a27cb371e47f1d79dfcb03f6a3bee6bc8cf859db3efd76d85f1bfd998629471ea4c0b57fad71c69e96c3b542f24c0a602a3c86d23acf5845c4b11ee06a8 - -OutputLen = 70 -Secret = 41a78256c74a2029c6cc5df2644e366f39a7b216ee49b885 -Salt = 697491fb52afef070d47a144e7d87fa3ae9aeaf2f4b080c8e2e9a2daf17ec3c737ffd03d218333707a82086278e1427e90be112c4ef89d34d9d5b5258c9c3456682f96 -Output = 0c388dea245898e29586e1530ba07b40aa2846be115e09278989f589dc54d8f714871e812ec3ec11200e30df0e62d5e334be7c5904bff31a6ee8ed12d919de08cc604595244b - -OutputLen = 70 -Secret = 71d82923749dc26c9980301094e3d930e6f11daf614c4f37 -Salt = e65ce96b70318bfda886c726cde0dd9b56871f031e458a3ebdbeaffd981682f38c97b76d5071e557514828a08918e2b3e9f900950a8f0e337d33d4f32543557fe479de -Output = 299517b74294aa6aaf56a1053c5ac00011eb5bfab5929e1c586fc285cf4d7527dfaa3c8aab483c315b1142dfdaae5602b1ee32763a509479de2c8f9393ef968d3048943deb23 - -OutputLen = 70 -Secret = e836ec3c2f51322b5180d1c2fa440bca014a4466d41781c4 -Salt = e139d84a1cb2750632a6a8c029d0b1b2bac2d15c2b06b8a1ae0be0222bca72573ee192ed72e8d40333f35649b7dfcd4ad7bc2933ef61bb59c8a0c50f4e4cc61dc94859 -Output = 059e911b67543b4e05e8634b87507113bef73c00df3c434e7029da3a0dce5b0e40a12551fe1b50d7c007dca10dd85c2c17c223fa8e7ee74f730cacce954714994ad665982385 - -OutputLen = 70 -Secret = 32c10dc0b42462bd48d17cbf85c59b1df07c2351888e4dac -Salt = 16ddb0bb6f4910f6757405a1a4d6c6bff9fff57695356a075d9ce1db1f5847b8f84440f27efee2f47c5243115b6c0d14d94a81db7319f9f81eef84a646338fef7552a8 -Output = ccaea03f464d92e4cb33facacaf09f4d8e452d1b3a8b24b72a233b65f810c3b242690be068933ff20482006870c14dcaf009bd91b6bd6eb45242a772ab1c241916d3ea636c33 - -OutputLen = 70 -Secret = 24615ecefb65f08d0944b8cc3d93435f10ba4b41ec3978c6 -Salt = af7fe93b57cae2f401bba8cdd1b0e500b4f00b4e99b11e93f44b31e4f9a6f683861cd5db1653ff62c7fe2da394ea8b0a43177f1d22a854f5fd9df52d1efc3626fd99a1 -Output = 93509f40a5053f3ac7708f3b38a740ab4b11e8fc881210ec556c67a676088cb62afb1693ef9f98076dac30256d36de7311af4c53e4c149fa618d5ced26dc9419df056e51dc52 - -OutputLen = 70 -Secret = dd5946d8da95a2859a08d38cf2b6221c725d4d40b80604e2 -Salt = 5a9f2723cb39a2afcf4b816698b6b68dceb1925edbbbcd86b6b56ac6e89406de3b0258f8e976f37c3fed1e6c592c9fdbb0a4b58ab8e758a28bedc7d40017f8c4bd1fba -Output = 1114127acde6a48441fc66251f92ea1966de3a8956f1c8cfc61bd43772fb0b0a6437ff4b65fba9986edc74e93acf01df52b1eb8d249464a3079f8a166b997090e5e89a962300 - -OutputLen = 70 -Secret = 4e0f0c6a0c3dd43009f2dbbf977f56e4f5d3d817f30d59d8 -Salt = 674eab8fee9211c2c1c33999a1d43ad99871c8f33858127ff1e76ba96bfb697a07ab6a9d441dc4b3fcba9e616dcdde99e04b579c746a0da6ae4a6fa9f3f317dba898c0 -Output = 5bae734142b028d2d035b0ddb6abdcdccc4c3ac5496e7385dd55ad5f58e73d56d5a40256838b9109229ab171e1a6b39a5bdc1bf90f431b269093db68cb986ae3c32da2f113ae - -OutputLen = 300 -Secret = 8729399ba89d22f1b849112d600cc273efa7c745316581ea -Salt = 3dff887c99e3a81a7712cfee86c9c7810e040f032355ed8e0068b4755db29e90031cd6e1ee351767b3b08c4a084ffc5935e09ccd0577a9082cce9bb4decba65a256d0b -Output = 0a9a7c433620854389dbc62b8928455d6625c53269b54840faabc75dbf0d00530c986921885736364f4bb9aeea021aabfb7c0a346c49d0cde3a3352d19246249f70ae3bc24f62bf10b71cdc9e0a909207390145ead9d1b257981793991a0dc9184b50c51f4e2733dfe6f160765480175d50f3c18726d1cbae55cd11c941254681da8dafde676ed3b5c021fb6701ab9d35a1cd9e929d1dfe1b2d040e0fe3ea6d24b91a47113e278c70e67f48a9b4809312ad77808bf9753c830cc3e9db026ac2f6726a353957ca368089c184647c2664063ac1e0fe3471bf312d87c186a128a71d8c5ec436b7f87cf109d9b2e55a7dcae6c8068071d56f77d825ade95ec05ab42caf4a2e615f9df600367ee441bf91abd195193a48a81b9cd276bd06822aa6bb3c7cb127ca3dfda8bb0db96b9 - -OutputLen = 300 -Secret = 3f0cc97272591ed5d1f27767b4f6ac69c69cc7809539893c -Salt = 28f19e862a2f03190fb6b8a1d7290392d2b7e447ed1ff1ac11a67fa15162a13308d110ce20598c178e677e4df9446df112e9cffac45bdc2dce3f507786071622a802e5 -Output = defa3e748b1a524b4c7b182a7f22af00bcaa3a5ff25dd9048ee578bf831e9bcedbda5583bae7d7f14961a7a317d79fa60f55da0209d72e2d0e54ff79220fef192d223563261cea41730c0ac47cd3a1e0ed1d79ae2c1bda5ee8fc931c9d639f3ac40be1efe9e19b963ea29f3a059fdc2f125571d15bbe34472557da276fbcde8420f3d521ef94fbe3c892200d5f72721e4e404b7eaf95e99b9d28d86cdd3c3f9e4dc6d6f4c6afe6691b3b41114b7e98069f321939e1111d39e0e7feaf7339eb17645172804dc7a5ba58944ea615ed8f55086d9765af39cf65a54721cbdf50415eac9e201898283452ee2e742ad01da2b487c612261f2601f68f9bfd4ad71476325bd0681ee6322de0f603935e4b8ad68582116f68a0e08359e62a413dfa56ee270bc308c5cd068cde4043767b - -OutputLen = 300 -Secret = 55641a82445690e6fcf73aa7f3addc662d25a6d523927b04 -Salt = 62e9054c125f8e1b0419048c4315a4e9283103a95b2ea5a1b16f86e6149de73818f407771d3830d31ee9485a06263827b42b5a80ecb0e671a7ad3cbc4e662f3da9982f -Output = 543479d037a19c70a8621ebb34bf834ccaf624af62bff8b61788a1ae4f0b56a79145c0a606ffac13cc1f32bf83b1537cdaf67975efaab39537c054e78f846282de20ca2de6a418873532ca5580438261fc15b46bf6bd95efe7d738b558d841f83d789260f97aab90ab6d469e39001c6881b9d54d91f131682b9cf39fae822864345dbc3047647e40b0329c19af788675f128ca44b9fd27a5bf98f519ad8fd9fde5a76bc91ea188633f3581454d66e0a266168822f785b57fa8ba8dbb49c516950c2782e32e60ce812dc5c68ae01fa36868229e8ec4a045cf2e43433886c856c6af82bce2d04e8c5735624eaa2c03397c8611dfc6ffeae21e1bb956d1896285d9b5166942cb164dd8f377d66ba560c4c4fb3f84fba666ed92d251dc928464521f508aee8b7d08875e72f4d613 - -OutputLen = 300 -Secret = 60b0aee87ee40acc1015d842efb15ce4c5e1b72b0a04123f -Salt = 637a5ebb1b1677042ffacd20cb88de02b161062edfbc0b53c17e158524585f68e754610b39502106bec977c48e35a484925800ce444c597edf58a35840a9fa7197a128 -Output = f068d92df6b401262a661ca93959e3429d0f50fdfe35e94da02c406fc0f3778255b6ad2b61d3727535500d513a0bee0283e59f8aed61b93dde1e3da6ab87c0cef54cae1d7d3e1143d93780e5387c0062a6a99c33c6ccd6b3944b337093c47a7f33cb03a47b0e5963d57f4cb2ad545c2a2aa5a8a756f05e0041c643053dfe56ed0d07637c4d98cbaa30371c47703586e1641a20af40eebb9382e0f6a6552781114e6899865f2eda9a39a01967cb9847edbc99ad56564bfcd726550a563212d62f6283ccafde06e51a0a15debf4007ced18cc63b665dc8c063ef8afe2e57255c88517ccd41a7557b143a67241b6f4b4e294cc186a620181eb2b14ca6a628ccddaa837f7df9f4a4132c2bb1a43a26a0a898495a299207292332058b8eb87d6ca301d4027798e863006f982926e5 - -OutputLen = 300 -Secret = 465e23953a2d72535280545bf6d2f32134cb595baaaccc02 -Salt = 2e4f906046bd31f49ee29580f3c4ee5565fb75ae1a701bb49b548c2c05557fd4d664edb6b245bf52bd5343fe8b6a362a3443c6748633080ac4baf3e8aa63dd3b116434 -Output = dd12829f9db66e5b2463e4052e8e621fb669ee1825df4d60588c121d418f8c91bed62cef95ccc30827183f50db90e4ed0bea96e3d15b02c897dcccac5344ecc3534951f663b4971e7155a53e14ad2d6c553212e9b3d39af2c994e552250afbd2f693f33ae693c90159a5c9c3cd2a02b37e8ceaf723e93a2d6778313601bb47f35fc86f5ebecc459e0bcf3f5cf556807e249c307959e5ea57b3201c50fa82bc809626b6c8f8512b8623ae3b4899525727353338dae54310cf303234c966ba0fd6c1471ac8f85b5dae1be0b034487c109eebb6e6ad5d789a320dc086532ff8987d22f1b253a66ac7290d46236e4f3e529c148fa3bf7f88b35c2c6595a61227c37d6bbc85c274b28d40ff8fac6b5ff43cb7d0b6a477a66ae82200b20265193f091c8fc066a4cb2498b1e6334b54 - -OutputLen = 300 -Secret = 098a79997f58ce3f8d1a07fd4d8e37292dfd0e7c585c33e5 -Salt = 95fa0db0fc95e2c2822280941de537a39e8c10dbf318767cbfb4d54ada64d82272862477e3d9aa5bf766af709d76430f05a617f3e6f5ce5136f8d105273c98e1c24475 -Output = 5567e1544edbc0a6eb3ebbbc926cf07332c4e33001bd666a970fe1c9796ffd5a1902f09bd17d6f503769392e9c0d0b178045641448d7e398b6ecfce681815a93a5fdebf954e48aadd815027a243311a004d69fec5c65e69da2e2d9d1a5dc9a6bc9b80bde325770e7fe2be19e906d0440f786c1112a0788eaf06b4617e8a2fd09deba06ca2628515720d5b68072be39c517900678f8546ab330009b114457c4b043bd9df8b4854ca9e6b2a107ff756bf16b970eea69b54392cecd0a4778706ce21c0492c7d9fd522edb46eb6817f00afd532b09af62522e0a597427852cecb9556630a5d1148ed22a2925919bf15b2514230f5fb7db82e96ab9059711806e9928e1991bf2df7bd9974dfd327c767833231ca160143ad79ddc608e1ef49908263e2a026ce65cbf9a120ee268d6 - -OutputLen = 300 -Secret = 259c93cb56a20ecf2ca6b2c5adb2d9d605d09adcf4fd820e -Salt = 24b7ec5899d97322312ed5066f8500d7a0da7e0142b022bf4b35c7811abf19d5fcd87586abddb887b1785a9e2fe9ad0883dfc9d7b84e82d3274464eace7ec51b48c348 -Output = bdf5d35b70d166f97542dc0b809f6173d06b452b374879fe4f0c91236a5ae04437a988cbf470ef9643254f4f15ad262efad4112fb25a84769513d6b8414471648722fea887f7cba126f248cbc5c410ca34e97a4ce1d5b72d8af3f06b2d8f4d563887915c5b8378fdf7fad15005bc1d771066b31025b3c6f623b5f5fccf92447446130a821307e45a8c3c98625642b202773a72ce3ab7e11a8006a7e343e22372f77f874bcdd3f55ab9fa85c65d07b51588132e9cb2b0abd8a058c04f89c63ce74aa200be17577c4cb84b776144e06f9ae8faa3cde01b5de1e564a08c2020bcdae636b6cca6353347676fb270a25da8e7ce110b53839026a1d20f92b52123573c934f32df78e6bd25fc50bf254b71ab2a428c6ffce1e418ccb807d1cce0a614e847afd941dae1f8a10d0574f5 - -OutputLen = 300 -Secret = fe6771a48a7d4fe87375fb202d7e015f8b922212ff6d6d0e -Salt = e9276c1843f0e4c2f46dce6e7bd4d90c241ea60c3e5ba50c2816843d39a7e81de0993db4e19092c419d5951af6c459dc476889e2375258aae49bac2b9e28bfa744bb19 -Output = 6cc79ec5a417466d1702ca82f6d593eec0c8ac7070c8ee11544a15a4f137ebed4aae46e8c61c6dffdc37327f49dceacb2ad09449bceb9c99af0c27cab2eaaf3e1ab6ef0203b5313a942506026a853c2d8b0c9623e8e4b54039bb45427a98c65896bacc587da9794dd17c1332797c25c4c95621ba10e447cdbb22e327e2398748f201c7980206604bb94d0374f6e91e0c054e28bc5c5a797ae86a1be7d6c3f7d06e71ad7ef79bca108c847332a25462b5ae50611bdcca7675fc30e0abbaf1cb7cbfdeb2d47a28db09054acc748d9db038114b09d3c5211335b8d1e0e5fe7e3267b92ce5eae0e8df2445c7ee33cdb4eaee94d26a0bcf4e5331cd0b7fd78155df40eeb4c2486adc8584c3f19ad23481ff5b7c3c82c003d8354c1b4e11cb978c667d2ead39e77f6f9ce7ddc45c92 - -OutputLen = 300 -Secret = dc92777781d8b7af905f90db95248eabeb982f797e50d5c7 -Salt = 90f83f324d54085de6be9db39dc2a0a27f657b03503111f7ef9d7aafdb30649fd5fdfd2ecd5845401c7b6ca983b036ecc5138985b83660fd68cc09d2eaec5dd6dbac4a -Output = 47a2b6a73c49988f9ea7f5d14587fb96dd0bbe359276a146229067a427a10e13c942158786426c88107708c2181dadbbe19c1ed1d4a89d9a35210d6506bb4c51743a4b00fa748bb1ca689a4183d70d23200974cf27a81efd4573f17d5075abc9db5feb75e7eb96c0dc5d8d85f1c62684def5acbd7625bf3bf4614f96aa8916b0eba866c94faddd4850c7129edaa51954c737e8d16ec9dd2e7f044557b8ba7a058c1f0541e9f23c4f32599cf000f97fb23da8d7831a52e4e0396bcbbcdf8dd225211f67a664a322a7fb12dedc54e44522e1e2dd6d78de611c0d58418025ade15dfc1d15f17d45d7d10d1d2a6378529be0678679eb1978b8c5f92379caca97a21110109a757991662817c3f3fe505c3c1ce6c129b6dced7fec3dbf85befb5694ee8a01098fdcfcff8b304be6d4 - -OutputLen = 300 -Secret = beb98b24e2fabe4e00ccb6602ad8957a1b74abdf0d9dd91f -Salt = be4e97d3a0d4d20e7a122262466150b912bf066bf36084ca59e6d7b2c7f9f77af87ac5ca433ff9dedf3275faa148b69704c3b1df3876af1602fb32789f5d67d76f3455 -Output = cf0e1c4f4827f37939363a361b5123ef82ff5035f52dd79f75977f1d1382936378df26a4c6d89d103c938c8a4a6f529c7b5906f94c02ace5739f672c2281e4e5bd6b02992f37780ded51fc1cef87249a9a2692ef1120ffb689c3ceb0e93b1c3ab1387a0959fd9257c7b51b425c8d2aeebde556c6bfd0296fe35132dd402d62a857810e7d67d79fc01c4f04da79edddb5eb90c60a4c35813d9131af3e750d755a5dad5d1ae363681ed127c7f98b6f8c235bcb52f5123a13c4d78d6f80eefbcd67db1492751302e4fcb88d6db89fe0e23edf962d67ccb2e1f3d324f30cdebe5667829fd846c66a623ec33929e0bf5d0fcfa90587b5cc4d8ffd446c0fe67871d3a6083b05c86bb44e6f31ff91973956d1304d0d0424c94555c94543f6619e21c6d262879b53b8334ae6d1e51bc3 +OutputLen = 2 +Salt = 7A63F38C461ACE19922C13603F4272C158BBA42F88B45DF82737 +Secret = AA22B5E2F58B4F644698464AF2B56EC0FF00227DAF8B40F8 +Label = DA93AB6F576C9A3BCD64CEB4 +Output = 385D + +OutputLen = 2 +Salt = DD527BA1EC9197FE44670024C7EAF9F9939DE0FD27A314C2E3C6 +Secret = 7DF5193C002A00983F7D55CB98DD7C781CBC342DF27C5562 +Label = 0F509ED5750513A26471033C +Output = 87DC + +OutputLen = 2 +Salt = CDE502829B935EFFE1DF0421FBC685C2029C52DEFCD6F988ED17 +Secret = 17251AA14F3EFBA81FE3094B559F4FDCBEFD95F8DF908BFA +Label = FAB326757A6CBCB0B31C67D4 +Output = 9565 + +OutputLen = 4 +Salt = 5B9D92213ED537565BD00AC5C395472F8D8530AF5240CDC91BDF9EC03EE1EE74C0B061E0 +Secret = 5A438F5F32DB78507AF50D5E327410F2E5C601CB393DFC81 +Label = 0ECF1DF02A46E38E7B9DC389 +Output = 0A361364 + +OutputLen = 4 +Salt = 214CC229BD6F110901582F39F20FFEF7DD58B97DC63D0491CC1545282216111E97AB2C42 +Secret = 6C933ECA3CBF300F7D6A6FC67ED63817C61619ADD9CF66F3 +Label = B636C5E28EC2E5FD5731F2F4 +Output = 1AFAB988 + +OutputLen = 4 +Salt = E11021636304E6DEF45D56D5B78003D1711E516D4F2233E3D0423D0B4BB26C48F55D0858 +Secret = 5BA166FA060C8CDC0394FAC755EBE536C897B2F08798F0B0 +Label = E81A71518AA4E6E2175870F7 +Output = 6A2C5139 + +OutputLen = 6 +Salt = 99AF0064CD22CBD33A055D0C010DF5CA9EAD070AC5CD5A2530BFC8509B9D906D3FF35381862EEC72E0768B7780FB +Secret = F1EEA00AB6EA6E53050FAE37E0BB413C5474FBF2BFC5035F +Label = 3495B36BB85A9AD07508D9B9 +Output = 8ECACB2B315C + +OutputLen = 6 +Salt = 9416F6235B79D93B82D8BDF48F04F3F6802D92466CA6194B63AE4B66E878909322572DC595982D5F250D605089A3 +Secret = 4CA0A26062A2EC7147635AE4065A9ADE81FED77B2A8AEC39 +Label = F9DD0F8623527EBF1BFB5046 +Output = 41D6B0226497 + +OutputLen = 6 +Salt = 6AD6D15F6352E1543CB4D0792105AA4B658BCC44AC7D5ADE18AF163DA8AD2E1E7B15F111C5AB9300C92574C45C9F +Secret = D2164DB73768A4B11FD7E9E39BDDD9A8FC2AC232BB123F90 +Label = FD7FEAE2A8CB0B82AC063D53 +Output = 7364D7D82175 + +OutputLen = 8 +Salt = BB8D776470D48F25CF7829A0D968C04A8E4EF883CE1F4F855019421B67B308D43890F1E3C6F67AF928725CB6022C88C830DDBB5A1BEFF55E +Secret = 258B028CE0500306D3C6B330BBE9DE9B9B2C3169709BDD38 +Label = A880A37AF63ABB953018508A +Output = 295A74E528FBF81A + +OutputLen = 8 +Salt = FA92569B50CAFA764B7DDC1BDE9A2B73FAE793DF8B6FDA7B74732DC0E9E6F4CFE7BA382506434F222057B1962EE2C5E64084E7371DC9FD51 +Secret = 2489DD0E6176A50D4837ACF6AABE9BCBB96A8E0BC79C999F +Label = 6CF72B6F7CDB7EF26B5685B6 +Output = CDBE302305A8B085 + +OutputLen = 8 +Salt = F291214C446EB05C45CFAA0AFE704A5920804AD031031A2751EF8DF56475F97D7DBA351B725396700686FF168FEF58F778F2856078A38CE0 +Secret = 99566395F891BFA0E13CCEF1F96A311FC325226158D7C70D +Label = 7A7C3C45BE5055C898CFB783 +Output = 92A0E21FDA176841 + +OutputLen = 10 +Salt = EB42ABD3D4094CAE394C089080239FD6338B2C903DBC2CAF5E183044806AFEE0FE479FE1AE5D10AEE0B28C60CADE39A615476A15EA25EA20B722FD31EC8B19CE2F89 +Secret = A36535A13B7AD6419E7BC5EC3AA10DB13E6B9415717EB09D +Label = B8571A57EB7708944BE6E500 +Output = 77F1BA55F74D45836135 + +OutputLen = 10 +Salt = 8EF980C725BB9B657B60D4D275F5B58CA9FE0CE1CFDCED157CF921227E8389654E9571904BF43652DDE47429C54403F5E041804D810362ABEF7139FAC9DD575101E4 +Secret = 1A9468E66DCE2583D85FD89A8B52438E7FD532E9B144FB91 +Label = 445AAB96D54EF0EE41B9D454 +Output = 392D27A002A709D421B1 + +OutputLen = 10 +Salt = A76F4E475D97282291E0CBB6440CD912254E87C1CAA70866701A4380D13A0D59C52991094C0B9C1B0A597EE7346A3B80FE7027532D2802B1C2D0D6199219CB691DB3 +Secret = 12CC4B05203BD8277487DCC33AF1116C99AC2F3DCDD9A615 +Label = 12ED2E96646C5647E383444A +Output = 368398658F949321D86E + +OutputLen = 12 +Salt = B278603A2C381F605CA875CA14650BA0DFCE455A2D12A5800E51280B1D339982C276794247A11E7FBD1299982EDC381830BB373985B6AF12971F3252C3E69FC817E7FD3352AB87DD6EB2A468 +Secret = 6F5CD9FD52FACF6CDA7409DE3E3BB109FA18574E7B80D9F3 +Label = 7E0F436129EAD3FEDD7814B3 +Output = 8C00586D2B0C85FAC5B870D7 + +OutputLen = 12 +Salt = BD0837794444AAB43E7BC80162F22D97037B6C6E624447D8BD0139A8390D711188C3D90444EACFB67BBE16A23D788FE4333583FD1348CE34E3C6FCDA68E53677E71D077FD6D864DA3B49C2A5 +Secret = E5E25361936866C2F56A0A0D437263C6D548FCFF0D716EBE +Label = EBD30B62E5B188E541B7FD2D +Output = FF1C85BEAFADF31F0D639E7B + +OutputLen = 12 +Salt = 344E8FB0E9C96B47145D4C47D3351F822952BDF4AE36C235367ABBDA2A32949336033DDED47B17961A00065B525B2D81FA7B8178F42A1890C7F3BAC1E503833C0D83FDA2B78C7458A5ED06AE +Secret = 16557D6FE11E5FAF952BF7A89C7E1703B508BA147AC950A8 +Label = 5C01FE984643EDC8736015B9 +Output = 10CCED14E9DD57097A85E330 + +OutputLen = 14 +Salt = DA1FEFA0114FC23128F122891FA6520FA612501D67EA59F0EBB68256633EE4AAD3838D5163317413A57B2B9AFE4FCC4BA3E4B67610B57DBE28C09BE2746D2B7BA34BE4B0A9FEAE901A105FDDE061C26C2BC13159888C +Secret = B5EBB9637C127EB81A005D74A1631383827D1A6B7264F9AB +Label = A9392CA2B1C0883F2DA59B52 +Output = F9E7CE606F2E97046513803D8DF2 + +OutputLen = 14 +Salt = 35B4DEAA328788D2D7FBA8E67498E90DEAAD64D49CF05587D6CE61F55B9A11F755EDF9C8EF87134E43753CB2A486E311DF2FA564A26B09B792526E17EED27BCAD412EF8BF9D4B76CED1159097CFFB23FF7A86564F349 +Secret = F06CBB55820E8659D1BB68001FD97BC54EB45EDF54655275 +Label = 8FF63DD0CA5D6DE422F1D8A8 +Output = EA0BD8256E6CC16DC7F9D8DD2393 + +OutputLen = 14 +Salt = E00168593779E145B48A8E831F52717B5C2897E66989E07C3E5C5652D052354801D47D6784E216FDE6268DA8FD69167EE0AC9172487B0E5521B15A86AB006CC26C26D6B80F49A8F1AD99E7CC4E6AFA4384E173858BAF +Secret = 6ADEDC34E35C1A5B5B7F17E8A35E9E6B72337BE3234A525B +Label = 50FEF0E9B2AEBDDB872C3B8C +Output = 7C6C63A6BF83999BEB2D10C35CD0 + +OutputLen = 16 +Salt = F4DD9B8F164987955C4E8F95B0F32790BA52EB3F2E022EB114FD1922D76B3F1B9FC4473D5B2B067A031242F9BF5596AE71E3713EF5BD7A982EC520B2EBD93B59A64BD7538E2F322E95A8777F8B4C2374EF7DF7E16AD71E598D12AD57030C92F3 +Secret = EF4F55638335E4922F7E5B62D44D9DC7870B275A2F90406A +Label = 15A3FD9C3B0C81FC8B32ACFA +Output = 0D01216F974748F990B016CC9F6DC7F8 + +OutputLen = 16 +Salt = 0BB59631D5557C5FF519538A37484D86AC989A3DB6EDFEB0FCBB127084C95655DBCFBCE139A8C5664607D93C71785C0F5F0526F0A4E26E0749D088037032124100B7A183F1B096221F0DC23758FBC373EB216275BD9A2AC8734E30DBE5638AD9 +Secret = E983540AEBC328C97205B30F4C191A3EC5D6A672CBF89234 +Label = E85B0D6E88B5530A30BEA6E2 +Output = A762CC74ACD44A5BA4E1CFB2ADA6E12E + +OutputLen = 16 +Salt = 0C9E2822086B6CB68DBA02FBC4AA78FE1CCD706103689DF59448CC0076086B76B7FEB472A54537DA20CFDF48644228860044CAF2191C3ABDE2BE5EECF16F939E61EBB7EA82B9E60D1CE0DC08AB7342721C8F625E081185A8D3620DBD5F58DB95 +Secret = DDCF451E111C7199C3391F00FB28D7217998BC5F67ABA99A +Label = 97D3AB8549242F85B7CB41D0 +Output = 4A247C01EDC0336B904999E6B46BE97D + +OutputLen = 18 +Salt = 2A21B45481C56E17083A36DD368255928AADA9E778621E553C9B3738AE7D539CEB8CA52E9B165CC878014F1F2C8A03814A0A59CD8DA7C43AD713641DD4146AFAD5E5664E67B8508943B765BBB2F7F807CEFFCBCB7ED80FB274AD80BBE1F7780550D07DC4D8962F89002D +Secret = CDD70F27EC9C76CAEF4ABC4D465AA51D446F81861C9BA68B +Label = 5C6C72916E83750A7A7DB228 +Output = 355ABA0EA5FB08081DD0CA4886B276B501E8 + +OutputLen = 18 +Salt = 1A322A8A367D254025B866C546ECB68F3EE469DB156117EB50F4CF872D8EE36775ECFB2B810D544E468C19E5EBAFD436A4EDEB6F6F2A0DA73B7668D0E606389B5DC6C155AD06C7883DDB5B71465702928ED601DD471A2908BE7868456D5C29E4DE8E10C48E6EE3487F9C +Secret = 5DA6C5D2E8F21E2D52720A15DFBF025860C4D780259F2088 +Label = BD2F60A6742D2D487D3160A7 +Output = C33F01DA8877E24A4FA12E845C7F38AAC94E + +OutputLen = 18 +Salt = 557C6CAE5CF3F2468E37E46CC2C22D2A2992EDB17B62A71016049D908A75DB177DA32D32074E7089FA8F99557F595D5F17281E52E5911339A95D21E728704D00948BD9D5A566EDFD31AED98F91BC522BC902BFA8DFAB75B359D4384AAAFF2F2A68C9B6983138B66B7CB8 +Secret = EBBDF5FCFFAD290F1A024649919DF64551D4A8F5979E7850 +Label = B25AFA0FE356C9E8C62E3DFE +Output = 2EB920F32742A62C716E068DB4C7BC733F6C + +OutputLen = 20 +Salt = 63E4120E71BBEF8FBA2BCA83B155AE9567E42063F97C6F7EF364721526092838FC5557FAB7456AE76B27DE5E8896D879C2CE35C640712FA8B687E4BF0C24BFD2F16D106B67ADED76943F5C9D63753882A5CDE87FC49CEEF62819B86B2AC70DCBBBC8D77354187D9B3125B421051F596CC6751B3F +Secret = 383BC4A6C080B165DFCAA1CBB21ADE4EF1F449A4BF31B219 +Label = 1BCF800F8824084AB7A1AF7F +Output = E5848CA0246434FBAD939744763B7E4F0E393665 + +OutputLen = 20 +Salt = 6003DAD34AA4435E7545F817F7CC416CD36995FE57ED91CE5BC892E37BEC0742F45601093110A36103721187ECE764B9796AB764A1649DB32CEE991F84BDE304379198649168CE8FA57C084E2CEE85CFFA9195CC63227C01B5C9BDD1978751DFBAFEEC8734101F57219AA896F7A9F6B41F33414D +Secret = 4EADF7323CE03F02B404758CB150B7F78050C8C3CE85A1D8 +Label = F97F8692586E9D2C607BD2A0 +Output = 3A51379A39E7A94E66966614FB7462B70F0EAF71 + +OutputLen = 20 +Salt = 4F287E8765FDFB4F62DB3AA0514747F377DCD140F8744BEF26464F5CE841C34DF312C2E2F3CBE9BAF285B40F8A5FA72E76C5DE6993C9A2D3C5ACC8D4D4FCAE586AA66B11773A07F86B1846E4A51EDBFC55334D9D1EC21A80B9F329167DE8DDB72AB35A0E5599DD650F33CA0125315DF38AFCFABE +Secret = 49E1058AD61CB645C58B5B136B1F95EA7F201817EECD6CF9 +Label = C6F2BDA8E80B7F9B65572FD9 +Output = 4CFAD3D6614020BD358BDC816E74653450D2006E -[SP800-108-Feedback(CMAC(AES-256))] -OutputLen = 64 -Secret = e51a150d87821ef71b9be1922d17831e906e3047459817852df951eb2658705d -Salt = 8bcf319f92e4695666bcb58ffdd0220f94aed7605eb7f0613830e9a371c8ec180c9dce50afc46d0122481ea4f19360bedd3c5fc3660f2fb694e40547fa7ed8a21a9ff4 -Output = 1ea70e79a5a53cbe7e9006d716a04940f1f113647bde368fa81d223ea1fbdcd0147116e92d44c8d86c5e6b91241ca46044db4cb5c61438f1e8d63246df327151 - -OutputLen = 64 -Secret = d23b113766566a894ba3d341a2ca6596422788a9830fd5c3c964001da5ad295f -Salt = 4e6ead7eb9a8e5ea1c7629f65cf0c048b40c61aca56ab6082c46dca030bf7836727f5b46accbac2c1ecd0c5705c35373f1e1201ed395c2e8e113dded11e78831f96499 -Output = 7a253555a558547fb392c7fc0b64ff5ce47f0edf18fe4242953af92fdae2a6aad0c5afb6e599e7dc8a1384643ba42a819e7903639afab87b59623b7310063abb - -OutputLen = 64 -Secret = d19b4cd2386f5179ab3be66f8af1aa7ffe17de738cccae8fa0e287d54a53dc13 -Salt = 70bd3cc82b9d987e36837bce89b9e5b964e7516b2877f5754edd4cf0589f0b46c6be319ffe8a0903bc287fd34b8c7611d9457c5b30b26c38c75a8c1a4754ab6b9dd06f -Output = 28cebae6dd947dfd75159f684fa51cda450faa70002278be41b6d59d9445dd96a111e57456152404fd5b1de2b385dd456b97e4a448d9876490b0b98eb9bdd57c - -OutputLen = 64 -Secret = 3a4c305d90eece02ac7ac9191e90b5bfd67f99fcd4a86dcf51383f84ce738792 -Salt = 47e1c0bf574ba7ffbed21ab6f3744a8962440c7818ccb053090dbee1bdbe8ca5cb61e149d1e512f491f62e452915da7c1206f408639f5e0b26028a37a745f5ae142b74 -Output = 7b3ec81eca1b12ea244f675174dab39433b0522a85fb11d8821fd67c37bca5a21e98a819964c16e18dfc5fce3383d774661953ad8adb5ae992c7fccafc963e23 - -OutputLen = 64 -Secret = 8658f26c770cbd8788c4b3086a1a839849c39b27d6c5173a1d2b9028cb125bee -Salt = 58b93b4ae46ca32d4aed0bbcd0ec2fa3775ad650df0b7476e12f1db03983b0730b7c13853895b8567996ecee5675698198bb3a7507e6771c1c2af5e39ed0e1ce0e9783 -Output = 0b9656bf5d541a54067765982f8eba066555803d7b97f2d7fbb61f8ad5d32d3607b27bad411a41fc85fb0bd1e430bd326b17f83aea966e29c96659ac70f41b1e - -OutputLen = 64 -Secret = dfe935aec1fa2cfe394b81c0c1369b86a12bd7e705f6d18d21a600359a64b24a -Salt = 2690631aefa3cbe0f34cf920d2f55d54ddc6583f3c2574addff9e7a627306af4fa86907e87b828956123ac324fc98dfb9061c25702f539476768f0a86d1d043b51a53c -Output = 8a3ba614990408a8482e5899e3b4b34c1b73325bc0495e1bf7df0b4a3921fadf3c8bb5b0173ee2afa8a5469159d742f399b7b2ef0f72770a8f0dbd15397bdcbc - -OutputLen = 64 -Secret = f843ceb6e1b3a4bb79780bfcbccc4cefdbe47cd936402bf55130864f35081689 -Salt = 0a16d4ef61fa6d61a23252862a33d2567f7845e2d3ff1c390d2abae045e807e7ef87e7e7c3326b32a6d9762598aa5d7a6c2ec626a663e0c62dd700e8020d456f5ea212 -Output = 041c25af7cec758791d9d58f8b385ca99c19027ab9745b17251636a772bebfe55305d91f9d0e26fb821180651c4a4a0f951b185aade3aa3b29a4a8442b96f1ef - -OutputLen = 64 -Secret = f2e93762c2c6a206debf4bd59701a5ba59dd7fe333e09d61c790774a9342b807 -Salt = bde601cbbc8b766684b4f110c8db7dd8212d2e0cee41369e043b376f76e0d1f6f8f1605bfe0d31c977f6745047d6c4921df04da179a341f3e0b470cecc318009e4a6dc -Output = e8e8c8a2258bca6a1257e4f56de063e9a8078ef152dca196583d8f45a4c15a836cc1d7b66a11abffcb3242a4bd47ec89df0cf08dc1198b99f6d1677ab658b6ed - -OutputLen = 64 -Secret = 1d9c6a88931da9fdadf0cfd38e5c85d7714546bba87e2b1cb780d055c725968c -Salt = c08e8693782b2f2c73b058ad8cfb2e0574adb58d3e00cc50e4e841a4caa0e5ad56f842bb4420da9635398f83f9efae274d5cf42e80639cc3b2d182a81a4eb9073d5578 -Output = d3b9f17760647b8d7f978b8562ee70e0b5bacd872001732ff3da66e98a96ad62d693669ffd2b934e01a961d7382dd713a433e471a03e1b9a2f936ae5746f4a6b - -OutputLen = 64 -Secret = cef4e53146c666dcdf73ee893a75c409fde0cd925999b6bf920549fcc4b40358 -Salt = 601d68ba3c8d51c916bb9590c1e782da6f6f18e99413bb763fd94b82d209a5a74afb0446511a3ed1646fc983501b849e9605325dc15896cc532ca592e4d10fc372af18 -Output = dfa8998ebd38bd60c64a9901744f37052eb1f7c1b49e8d4de1189bcd4af6a00ae4f2388eb90976a8522655817c3b4e8845ccfa654f7910d91c1d7e7a13c06b2d - -OutputLen = 256 -Secret = bbc3bd22ebe4d3582aec8229b6ba02dd142919d75938dc9130e96adf794f9b4c -Salt = fd4f7356c90183c209032fc495b4862c3ad03ad548eb92d594d718b5b5a55d8f032be65dfd2655d9b29eb976ec84db721d6f5b379fa8f83feb8094863a91c2ee83de21 -Output = 9533e3b10f4fcd74c95a59c8f6835d7100d339030aea727b10767a6dc127cdfe967cb36273d797e6e0342d198e72744f737f300475cf98813993efc82cd3eec262067af18d988114b4c62d026a86798c4298eaba49b3336a514e943eca3714cf22240ae068bfb1faefed849b00e698aa4fdc26650b3d293a00afb89bda6df1f3b47c5ed10743a0eeab147e2210a57b01b12cdddaac53d66b826bbc1ef7b4bb95049fedba58e2a2dcc013dfa5f106ce81db8a41b77cf3955f01f61937b754f215079a6a25ee884f3e8b792f04af112759567d76edae9caafbd22da312da1a09c43eec5f072c9308bc35fe069ab02c2cd2827211a0ff3451990e0ec12c4b1f3bdf - -OutputLen = 256 -Secret = 0e8f37436003266de7880ecd8d57834c6f3f3bb34f466656832c952ef0ee0a63 -Salt = c762b355e25b605d53047d869af1544a6ee749d7954295c49a7adb1e7aac5caf298b8b4f4da1d7cd4ae42774b390c9962ea7a6f0f1e575af9e7dbfde303464d7e8cb06 -Output = 9e1e9106465137cd7b93b48aa4d25049f0c48214e27b251409db02038cf8720222c44abbceb07cf9dc7709f75b0ebd68504ce830cd14dff84b7b326554b1daba233b2ad85a7b68c05323fdd24f07ee140f562c7acbecab186b3050ffb2f6e42b4f5e8b60972aeb992cc72e5b7fde372e35403c2fb9cbbb14188de7128b76e9d052a1ec46547636b66f720a6c1e5b962355858ca31e11f8aa4512b443f94d06297cf29608221aa63662ecec63b2a79ae44c2d3a4e940019af7cd99b86fe59b4aade3f70acbe474ebd55620e9a16897f940e42f079b34527b571068441325e1b3dc858a9188dd9c01408b1a65ad2b04ca6994a6895ba796e5aec2e2d2db479a452 - -OutputLen = 256 -Secret = 91819d82d2a57dccc012662d10973aaa13807e3eb5aee4f9bb89ff18dee8b956 -Salt = ec5b39c6c61d3ddea3b45b922f9e2c088ff640ed7ddf1b5e3d2b717177938717fa70d139c70280c3490ab0311bfa482438a318fe534295190067282c9e752c8c0c7e9f -Output = d2f707db87da03dbe425ae7bed851fb1491b9e9eabe2b2229e5fc94ac86918f3df944db47e1f373de0c57ae27e4a96b1e436316d814c71f3cb8a19497ec1a8da3bab59bb2af580d4175a7508020801aed98e34ba272f9971b6b6d0b6b1796d932262c7268a525bfd80ab640baea6f7a7170cf599cb725b1fab9036b6be0181eb3a06a6fab8c06cdb7386b8b4e503eee9c37f584d12cb05fce69a618ffc4035962b3035424af43a03ac1d8829e040989219c1a43168769c386dbc1bc1e9dab426f7c47cd8448e4e9a68a6ffc8150c557cbcdf426741e58482cb02939d238499d5d20d096b9a1f884cf90b443533c73aceb5df2a601019d14c55950bb3f6b93630 - -OutputLen = 256 -Secret = ab4368dc2239545a24cbd9114f1e5ad7cec5be21d2d4718a2eb0c2a9c0f10163 -Salt = d451b7fe163e96ff506300da614b08c26a30ac2571da072ae247c9e488844fb61b1c109afedc0a82e7639e67fbec3cda5f11b272a8203901225b89ea72068245c8b8de -Output = c107458af123f2696d814162173dca8696e2851df7277263cac0358abbd5f658150f2e6cdc2874ac4786660c8ab17ffa9e8f1020eb860f5f2feb35c9e22b8b1b3e92255106843a41af8ccd8b2784a54e4f41a1f42bbdeeae5c3c7027b0d06460210af49768d1ae8bbeedb9596943a8e5db2948678308d69a3788da57812bf1ea7889b441edd224a8ed62303f9452ddb4f31b9b2f12e90b22d797b0f3215452c7fcde1ed89373b3bc1ceb2b7b40d49b7e2ab78d0e6b7aeb8a3c0512b0f0cb27e436eb1901c9eb73694db53cd8e42695b22f36ec9c50e9ca9f3dc91886fe8527d5ca44fde04a5230c5a2fe07f8392d51b357fc5f3d420f74a34d8965f91f76d2d7 - -OutputLen = 256 -Secret = 80ad8df340537b8fed55d1a37ea9e7ef5f6a6b0d22fa30d6171cb25fc52b03c6 -Salt = cacd3e8498080ade01b24bff52f287811c565cf141988e34160e8d0f8c0a2d1f7702c57fcbcbd2822d51ff7daa412e7b1e5f2a613aa5f312256fb851f24e72499bf2ce -Output = cd94747be839b08bfa0ab2c5411c6d583ca3d589a4466e8c2f8198c05bda216738cc3d395119df6892c395faff001ce4244c6d0f061c884f291241bf5225319e75cc7f3643d6bc7ccf597118ece9eb59b65b2e404299808e8cfe13b4bc73643a0fb59206cb06f75cc4965cacb7d12733fddb727bfca4fff2760da263f2f60bb1d3fcd9e3d65ce00f559e00abb5ae1b2e98b58d5f771485c41f0f0ac076ccf8a429207a2c85a09a9d138e391790ca1deededc8a9c9101cf486b9c5377420c5fe5c5033dc811dcd002879429f6ce95bb6a169c41d2042ec812542fdb3c0e6926a375c5680df2c4dc49ada8361c71951addcb26f9eafe12297ec7079188abee8ea9 - -OutputLen = 256 -Secret = 9c88178099a69fe017110ba30f34c05a6b7546e6190b7da333958aaa0b1fc69a -Salt = edf20e5a2689952867a3d7082d53c0d9e5628798d122feb3b8f39fc66d6c75aef89984558039cee57cfd25da70dacad9dfae587760fdd127bdf01d78c832533a2dc492 -Output = 89e6367ceb3ce36602a97b88d5e2344edd4278a5537eab1c7a9273fee8fb871d75c53ce562ada0e6c47add3b94fbaddf5a69a10c7803441090f7f64c032e2ff2a1ca23c16314dd8ef9ac8e1a08fa1ccaccad553de186a2b44d3844e5e9b76f6f3247ed6b4a7573b42095ef2f0cc0a1a86b9fc96a69112712c4a390d59ab9d0543f33d02e3e5e236e64827f54b4d692648ca8217a242d20789cf84faa13eddcba5a774278ff2c41519e8fa9b4c4543e06f36e7c9ca3eeca5a9261000557ee52ac03f174d45fe6d838074b9a7b31a917b01226038a44997496ea2959947c12cceb87a4685be167d36a918274c052dd291e1cc8811be3af3ccb4970578d99044bd2 - -OutputLen = 256 -Secret = 34465bcff87c6a33a7769304d52d2a2ecb90da2a4536639d90585118cd580dec -Salt = f07d45923fed99f0de2b2f449c18d3040de2dc47e218b6f0c3a5a807ea0cc6ee21f119c79dd1ce9f7c80903488bde0daebba8cc4fe82d04a4caecc82330d7bddfe01a9 -Output = 369216e65917b0e0db20a646f099a4deb7f81745ef437e259d9b3526d917639ee4b9902fc785e9819bbb5436aae3589b34bd67816efba30b4ac0e880360b60e3bff7016a335907f4aed93258cf85eb117ab025bdea0d68302d8ca10c39418002d0d0c5f22371cd36c38ed8539cb05aed1f18670adb9096edba0ce0c5eb2a8274eb5fe01fc017d7be8e74cfca1d6ebc2e7a4c1a449ac7cb3c3060cc3fffcc116eeb6b00121e888cc997384426e49783f566dce7f310269172f690983d14203264d43934debf4a6772871c6ef53140cadec1ea34d69418caf429f5df1a36f56c86b214df9bb153052b0ba9be051848fa23ca7a9715fc5bf83651bfd752ad710a33 - -OutputLen = 256 -Secret = 7483985bb1391c61d86b7998b4fda33ede6ae7533fb1f17d98e5b3797ac14bb6 -Salt = 94b658fa66749b5fc0ea22b3026f58872269fb225de2a5d8d52323356f2d88d107d53a275500fd2791e70621933b8321f8e4b5e7e1751b0e648659a82364348594eaee -Output = 2ca1f47c20847da8adf086ac92526708d21352f6f23b7813df4812444cad27d8d56746de9c3311e18e1ba8a29c247459a62e34e9a31da3d7560311e3a99f3bffa2e1943af6f21d236469768dcf6d152b8e3db9275e75dd11a96040797059502c4cc3e1b86de444fd62f9060de76569143509b93ffab60b367b0043bd240bf4ab2cae18a73d7df88af79b170f94843c6cb81c8823cfaf31853c55b777a95ac3c523b4095e48837e1b2f279811c9c83ae6ddc27f5f2bb7289098c28f034d0eda213173879725793df24dce07a67a2d27cbc2b73a6673d1d3537f1806688c92348c9a400f131400ea944c70a87f8a70c594b697051c6afe5e2b8b987028d7728adb - -OutputLen = 256 -Secret = 19dbee8e43c6dba16fd8a2bb60b581cda4c1cad2e1e2aead0027c19b48362383 -Salt = 8924f68ef48f252ed18f74917d88e3176e6c8451d2085eb2c9221a40e62484cad34868b0ee7aaba43d52cbd0b67dc4227cdcd0d496d9e4b6976419c854897bb7cadacd -Output = 5883378c21a3baaf5718fb6fb14bd90622ebfbf75ef5831939974878b938e071bf53d7af64d9deddc414dcd3bf5cafa1e0e719d7989c57bc5ee3c8978e8946ff3f1cc68523a81379599b195d30d560a676fbacf149e9d07109f5e15f8836286d1d82e318e03b719ccb6c097fc376e3de62da48046b0e81663d1757e4278ee059fb60c540c36ed4ee6896a21649f9c9998954218f57afc7f3fd18098d51dc39294c51f81f4da67a732075fb8cfcbc17d0e57fde2c90ca17b51fc8ed101796bb5af7fb3cf5ff33b4042d28642b42f6c43083e03e432fdf75715c6d47202ff8ca6c0e089a8da4aecd2d25195c9b5475ac9c1e0409b6bf2ea3cdfbdfcaf25a4dacd8 - -OutputLen = 256 -Secret = 1956d541a4146b19e770a17c2eadfbb83017632dcede323ce24e417b27b9418a -Salt = 9b975cf44fe04578f7511bc3e2a44df38e1135f787c431a4ba5ecc1d76b378ef463e9b0401c5d66ef6d32ca22f5ce823ea160746c2cdda728868e00fe215e727983728 -Output = c53984f713f5084d678589edfb7a1777c26e6a63e10807653cc3fdf59af280407612ac8fd226a0b21c24f32857b4dee6aa263b5a78ccb86b4523b5315a3f72218a32593c2420bb03134a399eb2a39dc21d3b34ab2f3df20a222ee288e8a49f59c99a7f9e2bc86d8f000aa80a720cb02a66ba8389cd253ee89f3c8844edfcc7b66622652da577f4689b2d74bdadfb7e0b52c92a83d9e410020ed07ea8155f87a4f2c0559af5efab917ab20a73c07a05abf919e86f0e00146cdda423dfa60e079a4d77ec7b35774312e4bd469e4abe109cb7d36c9db5eff11e3a20b47dc8d00b7739fa778513365e5e3df56d3305dadfe2e10a28c4e3a0d536a940add093fe7b6a - -OutputLen = 70 -Secret = 48e16368fbc9c5683434974ab902f48e0e809778c36d6a3c81bed1cd9ab96923 -Salt = 440863431dd496689f4b0b001151d1aaad34d86035282b8be139bc22f894815ae6f00c386a4cd3abceb06a445f4ecdb29da9b984f82008119fcfa4f6a42cbe7946e8d6 -Output = 5e15d91883b13f9c111e63366b089f08fd1542ee4ae6fb8ce1ea3b08b55d4a60b90e32479b631a1c3c1fbb18dc9113567313935558e856c29d75b269104811f1c1aada9727f1 - -OutputLen = 70 -Secret = 0843e68c5181dfa51e8ca08c5fb6cb87588a9eb98daaf4521deaf3b80d0363f5 -Salt = b13e55f9842e3ae007e8fe2fb73bc83a53be9a1bdee3fded42b129006ea5a6da4a45cedfdfaaec814d3864af2c2eb4cdbb4778ec5feac067898a1977a5898dfe957b06 -Output = 8c4d8d0d35a3aae31ef927be1f6bc56dec7c8edee33f18cdb39e990adc59437a2b5bf496869127349fd99f23fdeb93731d043b72ddef83282d644b2a601e6d0f20d7b35234a6 - -OutputLen = 70 -Secret = ae3a5b5ad2649ac67112d3451be1756ceeaf811fceddffe59fc2d9fff86706eb -Salt = f5551aeaf74df40aa03b2aaa53ec7723363c7d31f8e8965918eff7363618c9ede0827731ce846a7b442c965cb11df5f23c280fb86a04ec69f3d870bdbd3ff45515eabe -Output = 2dd3f687aa97fe4888cf47bfdaefdf2c5ff11d3d818cc8277062297bf492bf3da8ed155c4f50c4e3bbddf384b66874e1f0d1ff8bab2f9757f0364bf6cd7a08f9d5fe952ba4f0 - -OutputLen = 70 -Secret = 1a38b58e2685ec4ee73c2a7ea206d7b5dbed2250df2dec35e96980ebb559573c -Salt = 3c518fa4db67e98742dde0ee40496bf5e17444e52b31fdeae269662bcfcf9c2bb196e7b85097c27cc8f1702eff27d66ebe39f3eee6e4ed911b1e454b13b3d9f3b98c1e -Output = 5247fac89e289f964bb45611fb92ed317355eea663b8acc0f0863e3aa5d3b58f47abe9e0b5ad685996aeab5a7153af96525aa888565e088b1bde5304153d7d77b0f1071548be - -OutputLen = 70 -Secret = 931d2b497d4106b8394f8376d34bfd9ae78a869944baf95cba03762170029c18 -Salt = e2a05ed9cd36088a98f3dacd469007cf4db9eca01e9352d867476e6f11e6fe09a3f6231588e48aec231aa0a69851feac10324f0f76222cb49a1283ed7cdee38d2cd777 -Output = 7567aca6922d70ce55bbfbee8fed0bc87654b268f6320b1487b5cbe49e74630d5de7beaae6c74806e28c96914097149a3c99826498302403b412f97b8bd201e18ec6f3ac2501 - -OutputLen = 70 -Secret = f7498e6ac0fd10c9483e7ba0b0fde46a980aeeaa26066e1d83ca9b47f8472ab6 -Salt = 2e15596bcf766002dffb8a45a7a3abf87988d93ee5819664fea7150cfe42b2f9ccba564d20704731f294fbe67368aa9f0ef7832115c5f64f642ad3c956bbde58eb7bb7 -Output = 8aaaed588ab16e4f1878b6c36acf313ee4b0ee4f81b2e52676b42c51006942ecfb65b38dd2c508ca2fac530097fec00736b0335a21a5f54763ea3ae155d75f242499f93d4427 - -OutputLen = 70 -Secret = 807b2a0187b72cc5d469de2bae02fe05a13fe9a2132959c90fe05e506cbb352b -Salt = 37d501cdee5e27baf8138ebb58cffa7ca2e838c2682fa5a3d2c0ed3f2ee006f80b4aa4e4460109d747cb9409713960b289374a02b060937887e424caba4dc5cc159cff -Output = de0f4260aff01c128652520e01bc8c9433652564eaef88de239236a83575df38fc108da64a3ad304805cd6b3ae180a53ce8723a6ef6336db311176d16afad02598b5c5bbee55 - -OutputLen = 70 -Secret = 73b37559c8d947a3c5cc30949346d97bc594933b475548ee33a27b92acffd817 -Salt = cc81a3f26a70c97a5f799116272c978d999e44b4d1351bfda78bd82c4450074a762a43120024af2ac5d1b1db4e6b2581d36a58552cb5a04b79ff836e4291b5b6a42123 -Output = 42f834c5cafe6a916d71f03f26bf694c16a575fb32e6f2df970a7b673bf49fd1aa78301faecf22880fc3d7608815e5ff8bbebd8a5e334dd7833837bc205e8e40c8638ad3575d - -OutputLen = 70 -Secret = 0bc4c917e245af330ed93425f86a4d07b64a8041c4bd8ac83fc2f137dee9418d -Salt = 68cf9086314ff8b8ef1f310bc1d075f899918974c2d0865a3256d2297963e9401096f4d20ad12abb23ebb2669f83ad1c6ada468852a06258b680d8aed1430616b974aa -Output = 5b67c493397d026a99df55d2f20fb7c7c02ebb45d62b819f79cdcb76ae395be9ce7d65ef5db307ce8fa9a33ae35f49795994c013edef71d0b1a71abe253b2d77f4f397f0bfc9 - -OutputLen = 70 -Secret = d37eadc09541e91b9ad6f6ce36d965e43e64924d9afadb55ca30d801beafc8bc -Salt = 114983932d455c43c923981bd681044bc35e047e60cb8b32fb96ed1bb8016f7d33437ab415c8955c0bb3b6aa50897bda4cc92dd8a32a9cdb481d5eadb8ce9f6386e43b -Output = 78aee98a011071f05bf48fd210ad1a8d44167f28d83c6247917bef9a01ee18ff4ef796f5f449436d79104a9916be1850b4f755ff9f8fd59aba4b65a3a23ea670df6c1fc891fe - -OutputLen = 300 -Secret = 5f5b36c125249e4642324a5d7ef8eab0ced18147f69fbca169db68cad952cccb -Salt = 07013047d0dfb40d26a89d2fccab86956efb9196324deadf5f67072823ab5a7158de5ceaf05ac07d152d940f24b166baa1b4e1d5004e8fc573edeb2e3a516879641115 -Output = 2b36dcd36c0942f2591a782cce0fe5b8197c3ddb22e1d3683e36f2aa005a7e388c1b0ea1cfa9687bbee9d12201c28568350ee3bab109344575b7856e357475587428a958157655c8e7f2dce742eeebdcf5ef9a200615de1ddea1953215b866c8925fa2cf07e58daca777754a324f48b5b356ba0331fa6bfcdd454d4e1fb1276aff0f097bed7c9cd3a04aba4103c86632b2148df2381bae713d1eaa9c90e79944728ef2b5dc642e9534fb4838c4d4f43b89097a9e19a9b5b6afff4a672878c642491db7999a77fb6d3ac9d995ff510edba9ad68d12a598e10f65a772240b4def7ca6931541a672f7595e6002d3b12d7e631a68b12dbb7ccfd734806a1b448f4ab7c1a5a7e07083451bc4321ad526652fa12d96a23420508f2073e8ad15041b61ec155f3e0e40006c647251da9 - -OutputLen = 300 -Secret = 81f48f12d748d0903385743edc4f395e4987893d0964df987a243f6cd06c4562 -Salt = a1bfc536104e6ab65dc41241c6ecf9b2fc2dfa33f244213c341932af49e58a7c93f2621acdd0daed4399d443bfd6c361febcaf950edbbec432b6db0fb1ed3deb99c456 -Output = 0d6fb7505dd9f33d5c5b2b3cf52fdca7f55de606736d709faa8745f5018dc4de3c4ba6e08c245bbd6977bde8fe5d9a7f54b62928809921e44bca38511bc20281f624dc89b8695cd86bc7d1c9dc3764f34bedd30314e95c32a9390797b86c870c39a6405530e20f1875e313c6f519c5b7cc01d2d66cee9ab9713603a6b733a371a3bbd1bad493c1f03490a34912a93a030f12ee16a81540b67e75392a213ef8e567bccb0dcdf8ac0c4d0aa74b0233a3868df3113302dbb12b5f20ed4c80c19d1419950ea65c6419c33b640318b33a81a50ae0c7452b8a53b2fcfa7e027b92625227a6d79b7aa419f271741835c1291cd3b8f21ac38bebda24ed24ca2c6696fc8da8259da0c00d867d3b320e2cdd4cd338a616bc2365440e48293e65f3fe206ec60278f6c7e8d2723b2554d0cc - -OutputLen = 300 -Secret = 409d03125f0192c6d9cc393859cbcb8626c65cf4dea762e86f6dcbc635993484 -Salt = 38860e07de29a0a211ff42aae0c412a64dfa8e57fec42f8da78b2219092a83af412eb813ad1c7c11b039bdf5ab6adb7590f713de188dccf7a31d70c8c13bc5ae5937c6 -Output = b72b69581ce188e190f2996befcb737817fa14a6e8ffe32e3de82b5ac225bdf76126d0d29bc59ec30874c2e9d085e21d79b88ae54777800b0e677bd4a80b7b0c1ce968dee45dcd8821a86dc746ddf9bce368ed6c8df47d67e497a9207bc952b678467ef90083648649c2d7535a7b53902d3487783f721e7dd4b179e3595598872b2a3cc8ac48be75a0c48d868c09bf27406d8bc5bc40a9cc3af796d8d24631bc6ef530138a4668047b7dc8615be19b5322f3e57939eb250e93075d2153230eefce0c0f6787ebb6dd8796d54edcdcaf6258dbc87a384c8257c24c2c093648ccef54a9e80d080377ec49f61e80a4fcd4dd1181e74f0bbc1f4a849336daadc88c70d7c863805cbacc4058eb2bc50dd084b7196eca2afb847d15d1671eac326fd4582aa6a0ad61e3d813b870f3a2 - -OutputLen = 300 -Secret = c50693beb934256d1781d70b3eb0c80a5ea8a63dbbb26cad8cd17821f97645a3 -Salt = 30423bd4fc473b49eac87f44155fd892cdd153affc009d2e1127aad49d9260ffba74d244540e74f4b7a2806dad194b988eb35c336ceac0f889c1c96abb22021b3eb203 -Output = 9cdc68583fed479de9719157bc0816f1f8913aca92d1af69da8cf039e0a877b10ebf0a6e274f1fae317b9c0991b09c2aebaadba8a095e6d20df7b2ce20ac90d445bd08c4b2a3ddb888e2e99c5e99b7ca9433807d463150762d5622b802003005909ab38ae8804053e75ab94c5c46448bec9f5b3f8fcdf8155bf859e5a2b297022bac44f36729d06e0ca0fb403da31b6675a4a8dca4657e08201f1f7be38f0bc1073ec16a715bb93ad506634b6377630f7043c644d57e1a7c73b09ad9bfb5aeb57a123210cd4c7712d7566a628f44ac19d3635a498b62d209aab94bf908d296e23dbb62ab74c40b40ad00568c4679c65b83acaada433bc347ec645d952cbdd9d13f9d182c207f63809e7ac744d5ed892fd1b82e317bd9b385f93850242e2ccfe94ee5c999ce113b781a663c81 - -OutputLen = 300 -Secret = 9eaff59b8e8155e7f2c895d800709d358923106a32366ea87de87f796fc60e54 -Salt = 747d709e1c86fed8cddb54e0067c585a46605d07dbb262f9827e54c34e1324e5fa5b97bbb52a190722dcbd639cc991465edc2b023364aa51b03d026f796e271b55d15c -Output = 37ff84399cce062fde0cd5ce1cab82eae9aa3f5eaff380cabaa2f458c8bb494cdb2bf5bea7dcb306b2150529f29422bd8502fc738a64289a8ae8df491341891a3fa0db7696ed8cda6f1602a81e59724ab92c5c5d0ebd31441c5c0a3c50aa2cff4a9c42c23a857441199fd1355a5bef2730d937a046473dd7dd890d433931fac01fcb16a8d00f3457ea9405c8569a41b3df1ba0bff68c156c4eae723cb605e2bf84e844abfe3ec7ab518279957c3a348f46d1ee47df284d8a7a41f874a6672c6ad52f4d14ebcc01c9f5f9f8c091cd43e897d7337abec41a75b4039f75437f86ab25b15c0d4425fa6f1fd1b25734c5021a48afa13162c80bfc3f865c8660d078b44f6ecb0d3a850464b92063f50a24049bfe0c273a1bf8d712fce06865adfd67f9427d96f85b63572072127482 - -OutputLen = 300 -Secret = 3d5f43327c8bd081523da7a94ed0fd54345b0c94223fcc00d45e2263212eec22 -Salt = 92eaac923269e5d43d30dc8025ab4567ad4b0e6d4f02f3d529d0f914018c72224d8ba2fe5cffd7831dab4e7f98a53b45a128bd39ee098c344f5fa7581400f1641c4bb7 -Output = 47cbd59b996ffcf3872cab1db0641c8c2eccc16514e936785e8ee33f5e373670113a09be2d59b220928ae2d79a5e0ee47866cefad3cfc5fee28d5eb82155866c816c9c9dc8de57901ac8bd8075d1f7f05720a136e673b262e83456d550b768a0fb7e767cdf4aec26dbc391654cf8be74933dd3075a7162e5eee583902cbaa347c5c354d23860cf1b33fae3f8ce750dee31c9dfc71aede0fc106e3c19ed2783e54cb702ea5818c5f5d9f6d062677ab230e5d5de12321ab6a251f91591c143a1c494cd09363ce6723a931f5d278ac68fb56edd5193d10d1de73f7865f9f7d74f9cab4d3b9a1065ccb42d35a6c3c648390a2b62521304696c450d979bf0cf0f61721c94ed530e4bdef705f715388e66341c5bb41f2a5eff6c9c2e0004f8814727861c64d86319e9ab3b6b8b684e - -OutputLen = 300 -Secret = 59a4d603cb81f840371912c81339aaad103ed8e235e9aea8d550be915daf95d8 -Salt = 58842fd37b4299e6ecb99551030f441890e06b4cf01b746d6bc1a1431b81e869114dfeefdea38410a8af0ff01fc446d7e13bf192862f601eff1750afb07c7865d49850 -Output = 3bb740a781cee12be13369f5fa4bf03340694f743a0fe5ae1f94f2216a9a18ac716bc5de9f53e022b0134e23c029d30787246b0112028c1a240b175eaa6b1431417df5e4f5f251e177ac87bceb3e9c1fa90ed9595f68cd503c430c3ce8881d55ea152042f57ee2c866bb02537462871daec2bf9ea31724120e03848679a6f7c7269d4338b25aacdb58ccef005d50be9d1a4815bea6330fd9fc8f245a8c265d18c00cb97317ea1f094380a11de3ad85d59e461ee1ae906ad077e39ce147f273927fecf68f78c18db44397582f396a97395024ada56d85cb928d4d03187c5f0960d4abfd71c3da66227dcf603d8231fabc321324bc4f00053f4fda490af9c70b5a3acf67dd780a897d30f32fb841769191914c521e7f5da94ef012e8b4f2076f89542ec49ab9ac18d1da935fa4 - -OutputLen = 300 -Secret = 951d2c2d7be0540bdf11cac1f3379538d4e714c8399b284ce67e8e856ca47fc4 -Salt = 8ad88094fc5fc135e0db7b41af8aa20ad109714b71e4da77f9e68a71b244108313b09d544ef5bd4f103fe3f46298cbff5885e068d48b0b3fdc2e2333a7ebb8d54c9435 -Output = 5889cc348fa4737387e84c99000a44b303f7dff2becf179c4c2ce2f05e4dbcaf0fdbd31b8d60aef3bf2020f6bc99c4d329974d552fa215f3c7db5e651be694fc3da4dc74c1ea3007dbbf020a5692ae6fbbe26297972d103565ac2f4159a1cc719dd33fb31df026c5e7d2053b11ed540ae6a892b46708be86d3f786c628bd3966b8536a7fc29768838f09d566e1e0db3720738ef3cc534d9fa324d6d326ddba27e332898ae5476ac4d3e4ffe382bd7fc5e6bc193f9ae3f95becd65be95a84613008e520759804386096682e0136883e1d3ad9207c6c495882a1735c7a6a1e51dd259cd31719580d0c32c0c3175998f7e558a8d96048d78137fd932b7acc4c5736b0c12c3244c5bedc3dd11e1449a6ee57ca6b6e41df33c5ecc46672f5eadb5a0583be35ad9968ca89ed2777dc - -OutputLen = 300 -Secret = c89584ebbce0f1569c52f6639324b83f95229301c6ea410fb24b5f1863d27f77 -Salt = 49aae7bfbbd8383373263027a8cf18ec822fab4fe225a35ade03fa68538f10a1e81e4483b13f7f69d4f626c1c11ed94f880897ec496da1aa5047399cdae441295f1d4c -Output = 1cc6d7985ed8b751cb0051802f07ab29447cf39543efa94c4cb6fa205eb1d62dea07aae60b53369ff34b617831440a6e80006a3e92a46ac12be3d0a6e074525e3a2f82eb2d6b11945d228d197f43bb75860b7cd453abab8b9ea002d0ca8d09e7b44014f6007323bf43ea740e9087cbbfab169fee941a8430c723b818fb2844ef991f7574b71fa2e435ea10672904419cfa3354a48d83cb4daea3ca3c15c626e376fcc2e3cb6f2d3b68833e461e8603191cc9f7c9fc87045624187cf636f19bf064d6687441d515e3c0a07093b8f9282546a3a44de287b566c05574c83afee2216ae2b4e2384c66df31cf54f3cfb99b2342e4c27aa19afed5070c529bd7a5e66bbcf3aae42be3f2b07318dbfc6f1c07d28ab3b52d5f649d912173c6acd940a6a491d3d8716d40f37c505eaf95 - -OutputLen = 300 -Secret = 979607b70a341136630eb8548c094600924f95daf78aa0fb4fbcfb36a8a2d389 -Salt = 7bee9952950c619467fd41d1235fa297b8692a9d0c2cc594cdb704e65f2fd95ed9b82fb57c4a8dd9f364868fe604432b18d5dd2292907dfad5ef0e9e55d14e84eb1ccc -Output = 7cef8d45dfac599da3cf2437588912e15ec57316dea6c16456a06682859dc4876420cfa000d5814cc061adcd4606362a68a24764c73eaf114e99f1a588658600af5a288773c101b81b7dcdcb692c43f2385366faff57cf2a0883014ce1f66b1cd98be9d593ae9dffa644c5726a10d3df9cb17fb5faa29790b94dc210422632f77329ce076358f8d6d2530a22536e3eed60724731ae0ce32da783225c3bd6ca35a148027045f8e06965457e0236ce2ee078ee5c155c1f790e0a86c2bdac27f1c8a7c44a374549dacdc7d76387f98eca4742ac6a9dc6d2d62803934b46a6a9fdd8a7d550a93f7d618721b6a9d9c203009485c5a74325f6001313dd0331d8b8437a096c03296aa93295c8f2755bb6e8c80ebe673f6cb9ee12cc418d3281ff7ca25fe332092ae723cb17dd995191 -[SP800-108-Feedback(CMAC(TripleDES))] -OutputLen = 64 -Secret = a6fa1722ad6ef62e54684b0dd0e460cc657105f85de95e55 -Salt = 666e3a63f1b5eadca55495cbe9cb7dd9adc8772c7149df558a179e01d0f810a7173f62764f0474c534b55262266ed912a81584f643615b0495d500 -Output = 7e063f6975c53a0c1f8329edbe17f1a994f7a361b55d512f7750c39917814a413529aa653b228b705907c63c2509a0771bd94ab75f03be9a9fe164e2ed26fe7d - -OutputLen = 64 -Secret = 05814dfde6eafbc6b870043eb5670a1bcaa7d15422d15430 -Salt = f714f50c26dfb9adb707c14d736f98076b29ce236563cbca3efaac0ea49315f12497706b6da74d3827a57ff8c5d6ae850fab3748853300e5318392 -Output = 420b18ad27b679eddad1f8343ec8ee38db750deb40f4851e4748149e379113ecd9a4a10a1d1512a1cdb23b512c0fc462071f7d35086494d866240dfb716b9ee8 - -OutputLen = 64 -Secret = 78cddf8522e37fd30eae25461b55726cc3f5b769a32abfda -Salt = 16ca9af506b7333af0c24bc025a52bd03908298eab1ba087fabf555295bd66a932c61cf362b29121b8bb3da20eaffd1e014578d5211b7df32ac38e -Output = 5f1b80bb1276460af67924e5d9a790b6e29da89fb6e456458df53e71573be3b038c1f4aad2c8968dfaa81af1605f32092586c191417b103cb803d501f57affd5 - -OutputLen = 64 -Secret = e7dc0cb4aaf11924040d4195f1ee90b39681c5b617a2efeb -Salt = aad975bc1f253d49631aafb880abbca8e0628599c6322e19d12e84b2e09cd25acf6ecb8d4bc7541ba569fd104415a6c489a773736921e0815bd3b5 -Output = 44fa8c544a40441db6f9c66145f347a64798c76a6000aef36775322fe08dbd894f4a89842609f9f5641f5bc16f094a0b4bfe407e5085badd650d70f15d72fb29 - -OutputLen = 64 -Secret = caf26eb0248e4f119dfe1944c61425143ce0e1fbb863be71 -Salt = a5a439adbc38039f41400af59340929fdab3d42d0dbee6eb37fca0621f805cb5b1fc31e50ed756a0369254817cd9f635f7f9f07d6f5f97d029fbe3 -Output = 7ee466834db681b5f836ace083d6717ca8f522a81088902afe2866a65805f46056fddd04d56b8acd776a3b7304a5eff9c90ddea6647bb362246822dacda372d7 - -OutputLen = 64 -Secret = 5ab07410282cf61a204898026ab26ff0f80652af953a229a -Salt = e50ceb6aa2cc109c8dc537d5e1a6e41795d8b38cf652d01bed7cc62980b04d505fa2fa7482823c4f3af9571ce731acaeec38b5300f8181a17b2b8e -Output = 9d10faab913600ac58b84070c3b73bc8ec47b9be46fa57106202b8793bdc43455a3723a7ae0f09f5ff485fb31ebe3eb529defb74c477d28dacb2261774224445 - -OutputLen = 64 -Secret = 69de25208f1a0d99b3fd1ede36bf179c21d0ecccde58dfb9 -Salt = bfe15f633f9938374733263fe35ad87f84aafacf0ffc4f6d42531f0822d2e5a8e6e3d55ae12b8d872d793ca21d7ad09b220a37df76c58b3302f2b1 -Output = aaf8302341b13f9496c61b3fe3682ba477d5f05998e8213e1ef9aa1a93fc980a14a1a393519245cbc4e8f7a2f303fa04887ade465f520d10b47221a46c9d51f7 - -OutputLen = 64 -Secret = 1acca96799ee906f9cf9b343c2898cdff81291239e461cf0 -Salt = c2f0d749c4fddd34a704edde4f7be57950bb5f9825b24f5da458b33d028d567b2fb5b8e06c0170fb7fa00e63de0953cca3b110fe932829212f421e -Output = c5b1f1352104ce58f7f8106ee7a5e13ec60d5b4f1609dec63b1d985ccac04b443357c98dba6743a92fe1a99461dd874a40a0833f0f28749ef0e05278733b95d0 - -OutputLen = 64 -Secret = 3d4dacf0cfab612ba658a300d46488d9313872ad21c9a233 -Salt = 2786c031b14d7dac91bf4c183702a6178606f945096ce29fd2f4f5278ca01afcd9341c23e91542ac5b497a3d9fd9bfb4036bcc2a86bbaf1e4a2dd6 -Output = 40557fcd753600a38d15994f80125da3146959a16f7776b0da5924ce2ba73da8a90a71cebb3ce0da9fbd0b071cb7b0e8ea034292e99d836ce6b1f4883a58e72a - -OutputLen = 64 -Secret = dd85a8c26bb9330360545489bb54a4bcfd01ea3ba5325aa1 -Salt = cb85ed165833c70573b5fcbc3bc3e8be615ff91439005ad78778e9ed8453c30d948e45d254eb60851ac1a76879c8e3823a940085835e5307cb6c5f -Output = 5630ee497386b98a06c430bf1cb4e19cd090274f31cead3ae226455b2776237f4c8cdd99b513c708a18885e1b29ad81b9ebc23b8b634f51387e8546336247c06 - -OutputLen = 256 -Secret = 02bd2386e55d09b945e43647a49217037ba8e0af07a2defc -Salt = 7843c639b3b9b84f8fc7156e531a54bfb0c3a427699b2d2481aff57c4a5846cd9865002a4918b3f84635da45342c9284fcfd91e7636bdd55659137 -Output = 1fcc3c02e8f37cfc3cb06238275d66fb9bbeb4a4b83aacba35de64ab6576a3c48ff2f44b081348eb395c686121fc75f487b5442d9790cf09fa60b945d329e50c9ad423075f3da8d4457b53f2c5925022f5e92d6d2fa5b91a9f44cd53f1d4ef1fe7cfc2d5a7cf17fe6c38638bd796b2b5950950bece2a988942e06d6c33867a8d1e7750e01c0ddb60c15d722629697e309251f2a8b50d3cd9b21f87188ecec695335aae47abe789d83811633f28adbc53f0427636dd7c55ea4bcf5d8e7a28a5b4e468da2f3dd426fba5e58b3f469983ca3f5ac2bf5753c882636d3009d7fb98168c882ce039f51be5dbfe83e09f64f836329adb8b2e7ca328112bc14612c12c0c - -OutputLen = 256 -Secret = 66597ae8ab77152b64030f517485868f07cb8057f72355ea -Salt = 6c4240a9edc931b0236293bf8f4f42b2550edb99332eaa8db23b339daaf05b9de7456ee212a682fbeaba73082ee859426da1f12dacb549754c4d14 -Output = 438b0b7a598f2cfe99137c69c4c8a63d1cfa2eedc67a3015b0d349a615c99fe556a319c9e5c4c9844eadce35581d5ade5eeca4fc985be24cec5359c5a00dffd78cea1d8faec2f76bd767c14de919369599faffda8cd517ba4668d392a2932e5ac2b7dd8686f82835b77dedcac1483fe52e81d4ff56905c475878a6ab28add2b66a84ff0a90fe58fbcbcfe221d79542aed18c6f64ec386f96893481f7d6e899e790fbe18500f154cc1ec21364e930c10bcda4e14b262dae1bf2ce423d99c03673a0121f8e4ec32702ef464104a9ad44aac10541e29017bf9879967bc3af55a464a3e6853a3b7b220616b04e9d6f84213ec716ebc49606e293911a04ae9e81616c - -OutputLen = 256 -Secret = e48e9494b2be30d22591371554bb395eef7f3d69eefa3c8c -Salt = db08ee57ac459238a8de05dc97d318ab65a4704ff0ba8153418ea8ff3624fdf39a7432d225ceba79ebe888af9cdfc6fa96bcf1579905a690216842 -Output = b055d51666eeb9644120b8deb712dc9bbb185a5c6751c8f733eac358238900aca669efbb8542f25fc0cfd841a77fc135d7d8aff3e5d08302ea9e9b46cd681fac21b3afb8f19f6e8dbaf6bf32714e2588febce1e8a86fcfe1b89e20f8973a055b6a2ba8bdf4f3d175b0353d570d6a2b56868d2fbcd34d65c26fe5b82a3e3040fd4ea95536c3155f16ce38c1304d9bf57af2e6fb124f66069ea1599399ffaa9d2d7965ba433ff3172b073cab9063bf0c2e21f8978e38f694af096067807363e2b43226983b6292f9cf7344c82ea6e2ba4e67fd1e926d6bc7f9125b2dbed19bf0c9511b4ea884d39189dc1b31f5bc5db4bfc671aaf9f032006797b34b0d958aa002 - -OutputLen = 256 -Secret = 2a2a9583fbcd0badf466a3738386608d06a7050c58c9ee54 -Salt = 4c39a62b2aa3f769dcb9accd195c11e0fe0b3cdc7d43b81fdc0628dc92c0e4c2656b0574781e85998f0591308b09b39bdcec1b7dd538e0922b43c8 -Output = a9efd016b81305cb355229f3aad78f3f57514e7daa0eaf12fe627d4e6d721911f602bea4ecceefd3b77e62ccae5347ad954e47e6b247e12de37a511a10e633bc4c057b5b7256fd50916b5d890379e344cc9f96e91e93603396638aefd37e602986f4aa07f536711a5a4ade14abda55c190eae803e563ddf89949868834b5cf242a1b6986df3345a6429403e68779ffa7b405df934cc66dc683b86af71df675ea889f6d2c87f0ca0822ab0139da9d4fd18e550fc8fab2f8c778f01af88164b31367f93cb0761e5ad7d5a30329931bc9e2ea4577b38a7aa7ce25e5eb6eadd86f8b974dc6b1ebcc0298d377e7c653665e0a47196ab43d3c9f6a251a56f65aa57417 - -OutputLen = 256 -Secret = 6dd9a19214c7ae343da4a62a617d1b8022327bb89ad4d536 -Salt = 09282e77248b9f3135e0e3324a915388a2e179fc98cdf7041ac2f220ce95dfc53e79dd94c13f0d02a7a68b2f819890ae8b8e2fc4db42255a98d2cc -Output = 7609892bcb9b02cde1643a972c29e1914a435cd8711e98f7f93cef557cbc760d03a008928f24acc6e5c4a45da3c5d3a2f68ec1c31615337258ff30b836cd1427bfff527cc1df252a9720dcea94f104dd573f249af6155632e54d00e4059b223005be027a479590cb89182a6f5c6d36467309c792d16364249b54c13afb0441af47a877aba1ab01f996facf0733cc2ea4168eb9774342a065b1ac58f26bfd005f53b3da22dbdcd7394eacda85887d0679e9279763f1d696af16749b01fc2b0f7bbc65c40ac6b8d0aeeee6202b0a1f724c9566c8ec70f0c58348b8efef4952c2cd23c24806ccb6e7e793d76541d7fe2f84c572d880ea4309bf06fde3dcccd1d15d - -OutputLen = 256 -Secret = 29bf29e7b5a6c6f5ac424f64527ca9d49a80393c53f58f44 -Salt = 0b3d59ce2ec24a638dcdb00fb88e94a4d7ae5f1f95ea571b6ca6cc625c5cd50e3199eee717dc2be724c6d6e48281bc49d1555a31d271eab3366706 -Output = 4fdb15707dcdcd04ab282c76d2a0bd50428b3cf713bc44f706f4bae5084036722e29bde2d1f211b10c3f6bf0b87719a9f91f5ec0112449c9d4e77cb8deac9febbc084af8dd8ec4cf81df6f22a8e5ab7a4a504819f7bae920eed03f70b48a016266a739de566fec1bbc47e8c1fbbcedbf1803e509221e3f04c780117244c17e053919e517cbc0ffe191903e0bcbb3030a31aa87d147854946a3100d329c7e359ee22b7c9cf501a8b099f153c48dd32b353d538c55036bfd3f5f4155c833341585a4058b59a6be0784ac74e54cd7393b82c77c166f3718382ddd400791f83cc5135bef40946c419408cafc598ec1f9ff91eb63ccf408054d0188cb3cf1ad0b00fa - -OutputLen = 256 -Secret = 44c1036feb3ed78535337168fe8bc53c80263acc648c5989 -Salt = fe0ee8326b163bc3c32ff7a10d05c012d20808fb3020e85a9bfaf07325e9436d641adb3578696692dbd8eeeaf8ee87a35223d10cc93f21b461bd20 -Output = e5dfb8d83dd82199d33751cac65a7e82427380d158e91da70db33411d4f285baa6b52fe7edfc00d8bff2caa6df2ab9fe770fbcc557459d66d097882a6c30e0621069d14114be6762aa8491a1e565fd9b97fee5e8ddd42c996bfd4d9051c07bdcd3feda40fd20ebef39cf74f197a9adce70fcd6019aa67b859fbc3e175ec166f8a2181f33dcc08695760d0570cb1995f3a5a64c14c887f4c83363c6928e47fb257b789836c95c8c839619f403309a5c8276be2cab4d1804e344cea7d897d4eac7ff64b148b5f278ab69b9442e44b620f789d0e26c4c06f86dd6554cc05e0fb83438cf029813c34010c9e52d77d06d5acbdae7d28beb0e0fdf885c5a1230455441 - -OutputLen = 256 -Secret = 5538b146863ea7b3169010d6877674ce0dc754a11d7b0cd4 -Salt = a1ebf4f73ae9767595d41ee06d4f734a79c7cfac6796580cfc2354a5201f8b9008b3c2d450b652406129931d305404e9ffb4ba2a5b3099fc75693e -Output = cb3df8248144bf72872e38ff591dd9ad564dc3a1eeea104dac062e5f45c167ca4f69da861fd4007caf44a7bd5a06dc130f7e0fd28d684cc17ddca98717a4211e9bc2cc743132d3fa7bd0afd5a6e9ba7582ee41272009201a9d0310b133732c7e617b25566cb4f71015efd5f4224a9e759c347b036b63ae0362627314769b2014c7d78e88d4e2092c1c42a725f3727eb04eee6e2625257a6f33c87def981975ada6deead3098862baf53b07bf339d494dadccd7306380a43dca054a1994a2efc584aee2906c43fdd1ec3bd2b355a06ab8ffa47e203dbc44285df297b58ec5e625c8e390b355440e510fd3317c8412444a657a4dec7fd84b09ae2c7a5ffa5e5403 - -OutputLen = 256 -Secret = 19310afaf5f8df2f06918626a9e87ffc04fd15f299254a1c -Salt = 4608ebe7e373a98cfaae8522b36506a3ae274581a912748dc6049021b21153591901acfe7a9941c0cba74b2dbf2e498d73ae50e934872cf8decb32 -Output = d4919304d33ab36ed8782353557d6baa1764301952fda9446f07f130643da1b00c09d2cdc5f6e7caba6e22e030baf2f896aad62fdae9d08e48463cdd9dd2a927601ece4505776a6db8e35cbb70805ba795937ef994cd14c073e8c626a41b23840f2140c058b6031ad5aaec95d6400826bb706fd95e4ffc4e50e8ce8fcf8a9d7d42e870f3c24dc5619886949e5c0c85a13f791cdcaa00fa3b081ad282ab47b23f06236aa72546b3022957a2d0a9f4d956a561b5f6007fe935fc367acc106b0cc783177914518b365a094f293c1fe3d56be38ebf46e18ef6738bc9828123b2e81445ded97461119dbdf19d3da2363943573221e22338398fd46ca46f99ec99e42c - -OutputLen = 256 -Secret = 4aecce1a70e8ef2241b729c363bed4e875634c52296b7589 -Salt = 8f904a65a7488ffa7e1fa4ad7d403e89fe7432a02cbfc1bda460bb0ecd51626979b989534a0888d4ad94ce9ef1fa09e1fc02ee1e3089d234b8c717 -Output = 7b1b8eab143054c33cba6a1f2aeaa774c34186362a5f6785ec00949c1e5452948dbe020801926bce9cdfe3eb4432efa81b6cd09715b20883028427fae6c722d489b27765cd5cab45cf94619fca4c96197ad293829534c07007ddcbdd1f158fac43cf10563ebf379a7c0d8f6147cee6ac7603b936445c1d85a443760a0d0dc69a8cd37b6aec3e248924396e2752aa79e9d0e32f197aa20db31d5547b489a6269d0c76af1fe478a13c395f4ec2cbf8792a2ce5667db36e403dd2aa1acb154418facc7e43277b4e768bf35e9b4dbf40644b3afb22f2574e9254d90d10031e885e3ef487b8bd52c222e6b5c9e835d37a517c424a0d86847e9b609bbcf02d5c03db46 - -OutputLen = 70 -Secret = 0cf58a798299483044b133f276429450fa93d9239e4d3743 -Salt = 2f0aad8feab1d91a087027bdedcb06c45f92aa0db7ace1fb5ea7219dff831ff684c051b542bb51419d6c12ab779b3c7dc333a4f2fff88f8561a89c -Output = c731ed4e10c09296087809b64b6b4d57fd870ce4040cd4a54137c7ad164fdeb757942a291dc06360094c77ce9c1f69178b9ffabb370a32ca23077be8465cbd1fbad183728574 - -OutputLen = 70 -Secret = 87e6bc899ca13917eaf54c339f442c7bde512e1bb02266f2 -Salt = 9d9c8e4c0710d43beffddeda1ffdc95735b137a6d736e60a087280ffdfc71ef1b5b515e08750f0a31583e34aeefef42e9a305696618e611c6b5c74 -Output = a3bf405a2451ae6456b2e7c40fd35104eccfa376aea2f924b28066c82bf62e660cf9bdc649222616d9b9bafd5596ee8459c4b5bde793ce6bdd29ad66e0be704743a4bd430a62 - -OutputLen = 70 -Secret = 0bd660e65a291b1fc917e31ae6b38710fe2e03b97c0469a6 -Salt = 2ff1d1814513ac65fe99cab977eec596a70d11c69ba7bc6a957f1503babbb767654791fe3bcbf20f2f804dd329ef1c24b0a8e778fa129c276e6cf4 -Output = 04040c3f4f925310040d479ee5c0f639d96069a6afc5422b9b8a70f6a608c9fe541cd138312a92a8d8a249fb004b3b5fa3f9f3afdc47a639b0853173891791eaf34dd8a644e6 - -OutputLen = 70 -Secret = 3c9b9adfca5d3fa67af2158a252b4ef5b90103b16379be6e -Salt = 12ddb542dd8073efeeb3cb3802e500e3149b08b642603fff0f214622005519416a32330b4b6cef275308df0f1a5e4d5c94b85ed456f1872e595142 -Output = fa057182ad6966500a0e1f90f04c13b832312bc343f9f91d39548e257e1a9b92685b318a705a5c0cd70f17cfb3b64288bed0767976bb49ba24cd23f1015eaba5b2952e5397a9 - -OutputLen = 70 -Secret = cd7bb4976b6da09c47926c4566a3079a9ea803213c6330c2 -Salt = 74b7442d6070f5da27f4ccd21195b73c08457dddfb3d6b1e47087debab91d53989481b08d5d096db77b1d62e1e8424abe6f672079f1e8010301faa -Output = 7f72a50c9e7f294fd9cddd91a659cd1328f539a16bafab3cc434f113ef6631bb6585d2e684b139fe844d2497479bf8340569567012a350d4ef5864b21f8bd8a1c26fc513bd14 - -OutputLen = 70 -Secret = 766c3553ba63587e57228b59dd8ce688095a6d4fcf0b1449 -Salt = c0f7ec26b8e858bf79fd2142ff2d2afab7264a380b29c01f27741541af0a5f1258bcd8cc11ea0ee41f47937db58c4c041cad97f727d12cb677b035 -Output = 16879f1421cecc0fb748c1cec72532366713298ba7ec8a6fafa77431b26d6dee4be27abdac76b04fdde2b08973728e85509fc5a3c2e9953e5773f51f3ce5b3b32e7996010125 - -OutputLen = 70 -Secret = 639cc86a24233c31af2c425c2d43a118850d7fbae6fb39c3 -Salt = e1ced50e13a425d824a11c924c6f4dc1b6aa800a058ffe8d29f74ba9f26b414e84fcb9ac16ec097400c9d018cb5783690095d7fa6e21c5e9798e5a -Output = e7e07e9a348745f84f720ed995bd8dcb0ccc3194b54f8f3bcf240bfd3cac75196168788d736c208f295ac6967238b774ca3892882bc58553a5e60ba3861a2b9a149f02a37384 - -OutputLen = 70 -Secret = 13edb1a69181190fc9dea7be317fed3e139fa3efec5496f5 -Salt = 2f0f0c9f43590a888440c1ce8dd7e2bdd9c9fdc59f546a0df913893fe52ab4538fa95c227640d2f68daa79e09ee8b754283e1cfd02a334a93a7512 -Output = e5e2826f8e68c49188b89287ea249b5a2e37f1bb89e1d0fc693491654895c256602b6babe79af3c955990ab35eb81093c2a0c1a601657d6e1d98f260ecfc8214f703e60bb17b - -OutputLen = 70 -Secret = 2246877cafc011372c0b290bc8230979171ffc936348d497 -Salt = 8c27e764a198ca7c7022be288b2c73306e98d526345678d431fff485a41f84338468d6e72a9171b267a2d538697b779d3b8c0ee32d05f10541d9c1 -Output = 6e5a0bb27d7cc3c0ad65a2a582be4d30c8e73fcd2bebe7ae6aacdf03454e29b932fd2f36d0c8c3b763e77b5161bdeb20f75156a1917fe0da8020598025efe637479d9046caaa - -OutputLen = 70 -Secret = af9b3319d92472899e1910da8cdc13c15df2ce0fc2282c86 -Salt = eb46803f1e96d8c016b1e85c7a28341c826e9046dbfae2a2732dfb1dd43ddded094ce5ae1e08f92fd6820765596091b2aa09bcf6e5312a433f8720 -Output = 9631f5423cb22cde8603e32078e8214ec2aecd0b3f4d7d92ece102a1ec3850976aabe921ac5cea2e5ed3c34144c2b32927abc9e39c68f351c93c4d7dfb151279cd0e7e057bd3 - -OutputLen = 300 -Secret = 6a502efc3f3aa9a0af58561af72c8f773be1d6c16919be6c -Salt = 9ab94acf5c5c88edfa5a461e5b5d0630a42d4f88438519733d87b3ebaa3d31fb190b3c6916d12393b19a0574b59d5266d138a2df4ea7ac67a5845a -Output = d5dc478ff35b4988170ae390c4f05095523f3c7bf09225d234311780af00400af0aa91df98ff4c7e474c30501c14b30f06339b4633561ef757e894fa52366a3baf16d458f5445c3e081445a971feb7a5a5df970efabcfa39dc94e466b343d95f5080d3caf17892fa20a9ef2c145400fb2812c6b093d6eadd3f83fcba0447163f355bc9deb29aab13b9955abca91006170bb5006f955bcfd3ea78a06e6692d2acd8eb888c659ad6729e7e207dd6a183200697f4550abcf3f585f575ddf3830d68d5072503a1a21af6503b5b37aa88d16a1db81cc988d7601d9f02e0eced3a8f219abc05d731ba352b547e3523b65759efdb02a579df3173969c6ed1ca443e41e5dffd211f9ddc3dc94abc4ebed26a76b35c19e89b2c174d24be532bebb26b0c97037dfdc64eb1a53239c4bebd - -OutputLen = 300 -Secret = a2c2d14cb292e7faea71f134ea4ea775e650072cd08e5f18 -Salt = d796c4fed701c8b3cf36a1f15661a9000fc6619b692cde50297f25f59cd90406ac256aaa198a38264f0101291d733be6dec8a5b97e1cb55cdd2551 -Output = 9a2fff87f67dc94d43f0127b856e7c8881d94e4b75aec6587d8eb856af7a25aa135de8168afc9aae34bb2b2fd10b0d11c29073b90304b2aaa24304c3e9c55b2ce4aa7fc0eed02aae051fef3cb2601722290807a757bfaeff2b5795083cd7a34973061e3d68e5e577c2e2b8c5086e19e1642fb401bdd8ec947987274c3f3f32b3f19fa22df52352e2923a791ad4b8d8196a3e9efd6ac0df0c1c6c0c425d08ef2d18cc6976c312f507871964083445e7a7800dbcab4d410e72e3ecd479a430bdd97f6e0006a59472fc6c96601275ddf835e1456d5c6a580272e55e3e261b459416eb68f04cf93e6be87daaa188248fd55564ba23c5ba3a504896f899a04e653c7797ec0049df690345d9a192ab73c3ac7f040a4b08678234808505e9ceccc6fcb5428eae593abf381c5831e0b8 - -OutputLen = 300 -Secret = 3729e3d6ca2cb1ad2e16ce5f1fe2c4d6744fc5b1e4786d94 -Salt = 6345f4ee72b76fc67f55f44549e530444444b42ff4008b6628d09d3b23f4c9cc8533ae805c4e7a564cbb747a9b246109e93e548e149df22c23fdb8 -Output = 5590cbfe84971622f1d83b1301fcbd990b4df11647fe3c3e38e415f41dc136624e60fdcc577e580d0b89dfe5c310e86225f709653792b350aa965d22bc5b1fbc57c925e73f2d737e912ebc8654b9f2bec0e26123b3d7629b14bc99c03eaeb3c35fdadad9b3256115f930dea3db06031512203c49771793a15cd34df2e8407a113ed24f78583028b455f0771a947d7c5048a6b0de75f05ae5e9969843e1577d018ff2d997afec46b4b721114ab33b9e7a431773e14530c6e64834a5e46941cce130a74c651a5e0fc8c4b36f83cb15754a0718835affe7f3b005ddfc5ecbef3df5e724726d09e90be3c4cd50d2428c77120d01c96d48726a396a264dd55e805b42c74b4cde5db465068324e9895184bdcc1a5f08d5805807f3924231c0347a152359ee327148517a508c87c128 - -OutputLen = 300 -Secret = 031231ac9ce414364e8674461f734e7a80b802b68cdbd539 -Salt = 24d532270d70e0b76187690b45c8a9ccbdc01de876e9048b6b41fc40bc556d013768cc789859d231d59f6d95d82d4ad94b64fc16850bf62f0af784 -Output = 0b413224596adb60a78a5c179410039d667b2a7a8f385c2d1d30dda37be7442f686276a2de5cb76b91fb57563489e7d9dacf05c6ebf461cd25e4944dc5246d5c2d7f1a21b4d69d18803f15715edf333e761851137dd3ce9fb17ebb0d8929c6970b0a4d86ec9f87035b573a07254f208aafdec72cd273835c99368efad645eabf5da32c73e5084731d9438cef18ef9cd51fa88a9037f457514664505dd9b866e2927d8d6c63711bf13c76df164c8489ad94f9de695fc80a85d7e2b318ed551aaceb6cd5ca3d55c81a66b6d0300d5a2502955d9f70ea274732c7752d9e9a148cd015165d0a3170617bc3d2d6c23eae8f87c34525cf2473d5670a9b21d41d9f01de2a41d16ffd0aaa2a3ec1acf44360478c3acf495cc66ee5a95fed6d030875c941f18e1e9259903517dce4110a - -OutputLen = 300 -Secret = b45b68153f5fbc5891d6d1d8c0549cca70c2a3ed7f9bdfc4 -Salt = 3ea859611d4f4244d681fed1e53f7785d8a8a3280293dd47051385b98141bdf31c38f4c84e65de43dfaef136a5cb5f5b503d2ea3a6415cd167f074 -Output = f8afec6c23d3343ea91a9e99887cc66e3323b99985690afa905957690449599f8594b1c67b3ae5609161cf88fa54bceca62b78478f8fc26643df83fc18872afb8ad49ee5bc0effd4ddc162e319d8e5ed4acb880c01c9e53ce99cd75f8afe91f600d3f67272f97bb59708a81caf0a9387e4f66b79a4e257f1b1d010d5b58892ad3c2774b74df6bab9eb08582f38266b071dca5467eda8298fa6d42e35fc38d6d343267af1b76ce3678a390c8cca0cbc92e92e8cb5e39bb6e464614dae092f4ae8857bec267d5badf129d0f67777734bf2dac3c2e8369cf258ae791af2c641eaa2e3f3d1258191b48d9e032fa9e85f4ae54fa5b772ddd1bba0ea8208cb12083bfa89a8a6706bb41d063751d5aed1e55487dfbaacd586f57c6c630cfbcf82b4d10476aafbbf853a7e2848c38a4d - -OutputLen = 300 -Secret = f7f50f877d1e8b1d24805e0c07a1ba7f9fc19f8519a851d9 -Salt = 7132d18e7d092392c4754c8755591352f4af7aef0fad3f650e981da039efb7499c2f0c2c1b1e3c9f8253b7f3a2eb2ffd8885b9326d23b6f70759ac -Output = 606edb8609e02bcbb3ac5da074f8f086ff830e370a31d20cc9f6937fefef4e48e4810bc5857e99942fd31f497d75949cf2e19ea11579dd3f0b4028a6c470a9606d30ff85cab2c5b3b8a91b55d1d34b9aecc316fac6bab4cec171cabf40c31bb095ad9ed2148b63d80f42cc13ea41a22e690dd18b4b316307fdaadaa8fdafa4e2a75486d1010819f2574b4a537ed3e428b89a5cc4ff89b250e417de8e1e3acb94f66f77e1cf524a2d8ec9ad079099d8c3661c35adf34d3401c381c16a469ced32442c05c9c9e1976ecfd4274c1bb2a6b4b23eff532fc4eea61fd624d170ef1f66bfea2d4ab5f868520efc2fe2f2a6b81ff4cbfac730b745423540bd3f9149c80f99fbded5e7420ae5e0064b2e89acf497c222487c75868c404bf6455670c26c9e6d86a864f69f064bbf8f2c8c - -OutputLen = 300 -Secret = 0e4ed4fec3d25cc910898b244e98bf19c067498c7e20bf9b -Salt = b17ff6171185d6ae3729909ebee1d16fb00f7be5b480ba03bd675ac4c8a2cdb09fc4b52cd0c3fe2b714150ef8dd52f9bda0393616d333d13fe6a7e -Output = 4bdbc09ff6a61c9d481c751174ffe0badd53add2f6be65fef260def1d2cf7e662e8e151750781cb2979460b8f5cb9017705f23409f567094a74cea6bd06f60b9618d71c3f912e125806e5ae250dbacde170ef03e2db55639263f5ba2a4eda6f686c5c893d8d577875cbb1e4f40210b5bca9ee978f3dc0d5a14ee792bf7dece03421b35a707ec0a92260ccd53086e6441e052d7b08ca357ac6bfca3b52ed2b3ced3617a7791226d08438f24da632cc91fa850a248fea58717694490c23d84d9e0817d3d6ed2a57a10cdbe4478d26fd70863e38d28054d4020e56673180fd9ef24293222bbd505e13cce79153db16eb18e2a2e370950771a0ff693575fa6973a3ec6a125955c472eb77353ed115e5fc909ed72d26b4b52b788d48e004776c9565f0657d43ac207a1842582b8d2 - -OutputLen = 300 -Secret = 2fcfe5460186b045183a090d05a7c84c3ebac6db75de91ce -Salt = 9aeb5918ed2b602dfad09ebf8b2d0e6356a1057f6129dd51c525655a4aad05e4329c70157b6545b76b70d53811d262014fabbb7dbee6cba1da45a4 -Output = 3ded3a1448dc9170b1347d1a570b344a13c3b266b2a9353e784a7c22ac0650a58765ca016cd6427e40591a869c5f71cdf1c0d43b8ec4517d0fa28aa4d8c393629284a7296e1068ac7bcbb6245d4a5795795cbfac74ccc1d9f0d72de34838117db4835d42d87cbc0b7533a19c35b79d29bd3d6ca600a52b79d6deb2c854a1cac68398549c52f9acbf40f4f6b01644641ac104176d8a7597684121b5044b514c3ed63117e6eac818fbb05d42135a7ec1adfe48094bf89a61af149ecd6b359b2dd86de5bce615d8173ad7fac6df0e778831c2eda71990a14015aab100fd99e54ee5ec425d841c6ac63cf1d7676eea50497bc00a1796777f9ad833eb1f5fbb1780fc8b8c8029cb7f97d674e07bb6895a7a1fa30f789d4f7d12bbc8e68f403038ddd38eff82a0738cc8bb6c921d77 - -OutputLen = 300 -Secret = 4184338d73469994dda628517408ad5e50a9339b4c4e6ba0 -Salt = 812c32d1205d7b80d33fbc541a66c272ebf2b3e212a486e8f4e2011c6598cc2ebbd1cb824bad7390a7f029ac37a2379fb77783e6d401af21198b71 -Output = 7a1efd9a125aea40a323c342f035984160eb2f77bf08271cd0608d6a4f0814bf8046159d6584d86f3037899b1cbad39d76274c5f8a30839c79417f6b0e5f71774fc7cca718ccfa7a9812e1a1d16f013f806a9f8ea8528909da94948da9de8767888b5822ebac280851aef89dc25f45ff9d402592807e127dcb8e51fd345695804c01c467ef7c704be20eea26d3ef390965c1a18f0a53000e96c6353e3070f971a5a140e5cc4b6db1e86ff71f316c184ebed0cdb7c982a6dba1deb0164167170ac9180681d1a0199aa6eac323ab5a7b7d3039f67de6285376652fdc10833d16a09ba5090832af651ad9d24be1d0b0e0513df225e3e3467d353ad5058d7803bffe541e8f951f73697c3cff8f2a0300fab3b20688f8d227b483028edc3a5aff83a90b162758481bcb5e10127684 - -OutputLen = 300 -Secret = 18257e120a0f4a50c76193b0edd2fde67d15e931a8faff7b -Salt = 9ed7a670d7a5696f2c4af715bb113808ca8b7d7720273094259993355ddce0ed1c22304717c898ba517cd286b3d155ea4a96dd8b6ddea771a3f3c1 -Output = e08b2575fa229f6bb1fb83462aa6a0a057060ef3b7811b983c4a6229e567fd72c8f8c48cf469d3fef7b7f231477edd343d6cc69af9aa1b4432a0600f699fd7efb2fc97e2a53748431f99c5f82c3141986bb9628ba17df833406abcbf5aabca8343eb33e51258a28277b3dee48b66325782b6ca10b780ca2141830dd40d29d8702e4ec59f7beccac41e943751c8339e363e1a6b42a3fd75bc2748ce062f922d0651b29112caea53e3e014671fdd99a20233756459eef0abff73d242edcb54d700851ef5e01668c2eb88dc06883fcf44ec840341bc2ebdc5d99000e130a4c7bd94344454ede0b4ebe13310694a867678d05638fbd91da97d53759cbc4c8f56bc1819038f66cbd56af23cb92cb060fb335deccd5247f02e2225b37ba729db03f0f60bd9281d53bfe9f1d5a92bec +[SP800-108-Feedback(CMAC(AES-256))] +OutputLen = 2 +Salt = C0A863D41C29A55A7B5E4BD9163ECDE7BD27A8ED3CA1952FB16C +Secret = 6F6543BFC23614845A0A41541313AB72DD8E5B56A463D6D8CE10D73307E73D5A +Label = 0339133AAAF7DBCC49A1F41C +Output = FE44 + +OutputLen = 2 +Salt = C083B2376280AB4A9BE026A2B571FEBFBFDE571E3AD06497FBEB +Secret = BBA433917C4F150808274C9508883C6EA5AC5FAA5CC187DF490107310C8B2FBB +Label = A3CFA889AAF42D0A8CE8CA43 +Output = 9FCF + +OutputLen = 2 +Salt = 12B9F83EE8FF6C5D3343403CAE1553EB780D1A9332235B3D39EE +Secret = 008AFC20771278F46AD3AD38BBDD399A7C8E6DDD1C993461F02E1FD0CCD47470 +Label = 6D9DE1D6F379E3783C5992E5 +Output = 7C39 + +OutputLen = 4 +Salt = 1A91E1FDBC7AFF6207A927B56C3D6DF868083F3AF77EFF0812775E15D4B4C243C68D464A +Secret = D77B7BC065330115051362D0405B20039F53B394B1E82B0EFEF2D97DF771D812 +Label = 8D98E4C60FDCA63180D96392 +Output = FE002DCD + +OutputLen = 4 +Salt = 02C4F92461C2EE216D75E2DCB04EE53706AFA8F5E6BE977618029F0C61AE7FF2B1B60A2C +Secret = FC7AC0CCE66A7E21E770BB6F6EF51E2EE699B5E5CC0C89B1F309EBF15A93ED06 +Label = 1D65A89BF1745991ABFE7893 +Output = B981DA91 + +OutputLen = 4 +Salt = 04413A62BBCBA17B063219F3D565DA3DAB30336B93E8805ACE3D4FE0DD75AD759982FA4C +Secret = 58D44DDE413C24AC8399FEBD812F4117AE76BBFE42C4E9A133E329F1E9D707AF +Label = 17EBD7F5A282A4CEE4C29FF9 +Output = 9C068AF0 + +OutputLen = 6 +Salt = 7803FB4425B6DF93872EB3EE95DFBA4FAA31984D1B986AB1B2548BA97B58C08D2463C0B76C979F72F6533E1A0C7D +Secret = DFC043EE52FFB3039E63DEA43485AE71F8175AED119E15FCBF3A8C2ED8CC843B +Label = D39E4986150F3E3AF174F87C +Output = 2C1389F101CC + +OutputLen = 6 +Salt = 635168098641B6C7E617530D02EE2351F3F656F0EF9A4037939469272E526B2A5124EB20620E569BC4323C7A81F7 +Secret = CCB85525E6E277227768CD175C5617F1E29FFB5682007FE2A824C8D824F0A707 +Label = 819C10DAFECA4449DE0535FA +Output = BA202CA2BBAB + +OutputLen = 6 +Salt = 64E47CDAB5C53F86D26AB3F2865BDDA01A7C20B217AA1912F8324BDB99C0F20BAD1AE7B339A0DF9CB743BF874D27 +Secret = 0A01C423049B5CF7E5455DC9E180FDC8317AF700D12B05CF7FEA1C87E7525DD7 +Label = 418A5F2C5A59170EC02F066B +Output = A908DE9437AE + +OutputLen = 8 +Salt = A217990015BC82B21E4AC97284AEBCCFEAA479EFC89161730667A4195D349546153ADD28D5C3AD227EA6282433D4829705F03A340C12CA32 +Secret = 3757874A56A8496E38B23991C85B91271770E5E5B884A8F3E18A36B44878BB91 +Label = 823DB10A80E9EF8CEF839CFE +Output = D49D1D66D0353C7C + +OutputLen = 8 +Salt = 8CC3CBA884D6BDD21A4E3B5A831B80DBEF5C3FC9A83707CCED54C98CAF03DFB26662C2C366C3DBF7741FDFDC3D72AD4DB30AFFC480981C6B +Secret = FC996EAC40CD6FB4564B507965C5DB6AF6648641BDE952021BA864855DBEB6F7 +Label = 1BDBC4BC4FFB59DD9A7C6575 +Output = 2AFC6C51583912B3 + +OutputLen = 8 +Salt = 5985C68B8466BD977B02B565909E4C37FB787B7498C5ED1FA18DBECAC96E7EA3E96F9FDAFC7AE3E167E60A33C10F69F5A74BD43FD28A411C +Secret = 53599869108CF4BBB6845F432B50715D8184D2EEA6F89E55DBE4BD1757E2FC58 +Label = 51E23A5EA4D871E1DA8B5499 +Output = 3F5FAE610DD6EC88 + +OutputLen = 10 +Salt = D6390C728E207C73EAFAB25EBFC56F9F96103EFFFE335F0915E7197E43C5A8EC4E9553D5CF8CFD79B3F517BE9B7EA36D655C9C38C0A1CEB25F14787C4D948F9DB990 +Secret = 5C900CFF79A0DCDF15A66B362E029A1563E2162127F09EA8B2B5310CF9CE1225 +Label = 207F6A3D7E59BE78EDE13C99 +Output = 9AEFA6E8D234F3257052 + +OutputLen = 10 +Salt = 624B1D6D3CAD8F4F005F0A6FD7E36AB34B62303AEEBA7E0D1FC22FC3E2EE1FF787C3B95FD0AD854DEACD1D47F00FFFC578BF62EBADB4DD28E0A47D5E1456D7C17272 +Secret = BC135F05C1FB3916D9C34F600F80C0B1A4F18822265BEDE674A2C9EEC3EA3A95 +Label = AF8E368C7494B4E070B90F42 +Output = D292A8C22876386F90E4 + +OutputLen = 10 +Salt = E92CB280665866427C20698C94F7FD8A55D51453FAA598D127E293C08E3E68079BCD98B35192F77AAD3896963DE4A5A99A57CA42316A518BCF44CA5D964A8E10FB3D +Secret = C837BA8209B560C34E1C5F6B21DE2D98E804E644783803F55BF903BF8ECFB307 +Label = AEE43056DA1353651B21BAA4 +Output = 736788341C6624D08E2A + +OutputLen = 12 +Salt = 3D9D95163908A4F6FB96D3DF308E6C85CD6E36EBC37F64626275C4C5D5258542980CF54FA856B375451CA71646D00826273235BA1969217F87CC980211EA0CF015A2400F657EB9EE03E1169F +Secret = B848EBAB739273F4CF4CEE31DFBD96F875077D8C18A4118E3A11051072948800 +Label = DCC3D62CCCA0F03431D8D26A +Output = 03A96884241C0851450E2F43 + +OutputLen = 12 +Salt = 22A5363C1E4B21623D8E0D6C9398E936A89245F6EF34D623F0609D839865F1D00CC4A166C8D666BB8650F06DBBE10278266CB42C181C3A9A09ED9A48C2AEFB358E80FEAED4B132D36719449E +Secret = 2803F3EC2086FDEE6DDCA5592A35527CBC69E2D363A03A3449FE1C85FF9DCFF9 +Label = B4A06861D7E6CE310C763348 +Output = 113732FD2641727CADA20826 + +OutputLen = 12 +Salt = A976D5810B7D3FC48CAD78BFBB09E2455569893B0CEB0A29E710283235689A2E21159DC1556B226A52741509FD38F68DA2ADEC088F4E8F1D27108B4B0765C4F33998A9888BB2B251B13BA709 +Secret = 0208D58AE4A1B728F8524272C37ED97CBEFBC8F7E913142482B9101944E909F7 +Label = 3C32669EAD0B9FE957268057 +Output = 24A1D54EAFDBEA28E196F23E + +OutputLen = 14 +Salt = 769B21F3A9892353600B45BA302525C422BBE05038BD69F4C5E938D6779D85D8AD57BD5B7137E7F33457F9554F326B911F92BDFE3D5F0B9FA098072F09081F5EB6A962D5CF0D6C0BB8BDADAE9FF88AA16424F476E822 +Secret = 54A47D66713B24C91997D1E563CDA611DE9B3AB8C82916B3F72B32BB4B8FF84A +Label = DADC464042607EF108E42360 +Output = 222FA814C740EEB9DC8BE75DA456 + +OutputLen = 14 +Salt = 3329CA505C969CEF7C8620360CC8002358A0FF9610F14CCD4453A17BCA276CF679C5E9B6DAFB7360466B4504E32D1A84663DC0764729BC2C9EC34A515DAB8E767CDD9E1D4BBDFDFB7F2C8AC4FF5E8B8BB391DFEEDE25 +Secret = 4FAECA2D110DCB986D5A679567B134E32AF70D46A221D6B80B9A2B2F32C8D14D +Label = ED17444202D6C0CD893008E8 +Output = CD09ABEB77D128C6BB54291D92EE + +OutputLen = 14 +Salt = DBF32CB91ECD63C9FCD3B907D3071DED4B98AF51400050C85F57969F6BE372F0169CA5E3DD25D5D9332B9A1F859F1DD8C36665D810BA05CCA4642E2671FF0072EB8E969E38F7ECBE98F4C580055354FD44F17F5C8074 +Secret = 5940052BEF0E1D5D804BC152C5F61D2DF9F749F3C2554543BF34166CB235A757 +Label = F08134404F9C8A48EB171067 +Output = 46CE0B60866FD7BB2AE4C5230D83 + +OutputLen = 16 +Salt = 4B0C3383204C91B5EEAB9C29ACB0F574C021C229AC704894580A73746C6E469B184E1C2BB9B005B6E7855FBEFAD809E0193DC29D2B9E5EE72415C19D79795CD672B600C908F4BF6FB5414A560C364D15AEDA33B63CD190E2B6E6D3E92DDB34B5 +Secret = C4343577CFB89462C4ED767ED87AFA576D45AE884841471B63239634D3583D75 +Label = C23653C1628357DBF0A8B0E7 +Output = 5F13C4AB18EE5825682611C4E2B843CC + +OutputLen = 16 +Salt = 8363A69F650B0AE74C1DBEAC6C92C94B2D9092675DECCF115ADC001CAC6CFDE48191D31A51AA48F9C246D2969F0C20B6ACF2F57C186C25EC5F81FC336A31A1785CCE1111CD1390D7C1B07054BB8372662B901AFD3F8180163A8EEEA11FC55A1F +Secret = 3B17FE8B7EA4825806DD3BE0A2E16E8E7DDE9008629BE37B4A090D011D8F7430 +Label = 2AC625C5EDD44E5101CA5349 +Output = 522E19F527B933A4DC473341000EEB39 + +OutputLen = 16 +Salt = 4D57C1E0824658C3F531A8059D1A299F9FC92D2B459FC960F6DE764066B39D567C2ECD830AE85C860DB97DA6186B6BF36918A5EB997EB41B22464B8698A7ED4FB146A4557B23A14FEF4B0A9EED69E2DE90D97D646EE30215970F324D1C1CB11D +Secret = 3BC327451E4AFB3CDF21AAE50D0655F549231CD31C0D83F75EC00945B40EDAB2 +Label = 110FA488F2054C7084CA5D6B +Output = 86AEF79952314EB608BC693F43FF6E92 + +OutputLen = 18 +Salt = 6F72CB3627BE5B5A49B979640D08EBA0106E306C2809A94AC6ABB15666EBF259216151394DCE5FC97149D3156EA1D38D6F692D60506ED9B680B2FB0CFAA88EEDDA0F4C60E22359917D34B79AD7DCED7D9F4E5B800C5E6C4783BD31DC8BD46D324C63693F349BBCC41E34 +Secret = A4E7CC9004209DB5BBED9918CE0FE6F2E808528B660FB27E371458DD0288E466 +Label = 0B0361EC924B22B7FACCD703 +Output = 10DD052B25FCA21C95B1C082163A257E7379 + +OutputLen = 18 +Salt = F9039B7FF214CD97C5E4776D7C5D570DDA5CCFABD3037BC203C5ACA831ECCDED3D4A8A581B649C88E85FF9193B2D2D1E46C942AB5B1D4895196372C3F759929ED868CE40128A10827F85A993A938B18E80E114E1B7E40F8C2DE0479D4F5A179E12BDEABF943471D62F88 +Secret = 82909A7F6F3140C20ED10FB7F76EFF29675B6590EE3176CED695EC0BFECE979D +Label = 1D5A0730DB27887C827D20C1 +Output = 5B776E25655E5678A3A511B36D9BCD801D61 + +OutputLen = 18 +Salt = 72F25CB9AABD52CF767752DAC08C393EBC1E3F56A0D13EBF5B87E9069B82B8CDD61361F7E8F0042B917D99878CEA8F9D3A0734FF05157CCF7B9F033907DD924BC1BC6944384FE1E508EF18519B36B3BC98556F429ADE742E13780A89D7869561478C784ADA5268182066 +Secret = 973727F10D9E708F1772E8537078366A9D5D461EDEB633754AFBB4754D001A06 +Label = 9E9BD7B505061805AE1BF06F +Output = 07224EF6F0CF21EE03E55C0DF2D2174DEAAD + +OutputLen = 20 +Salt = 6CC4BFB768DC0D2CBA8210FFC1951EBC810CA69E280315EAD718C41056F59E7BF9E42CE5A25A0EDE1903276E9772B79D4596829408F4CACD9350E2EC9D1CDF4A138EC7C935F10606BFA4AD419081E5598CCEA21A8513E5DB150F956A25BBEFE6E43A7473A9BB71E0254AA5A9C8F2BB4F25E1FA24 +Secret = EB1D7F13D9631933C5C193F1BAE8FE3DDFE48A8D956EAA950A90B1632A82CE96 +Label = B260AC15F242A47C93DFB28D +Output = 786979D7A7C804E5BD1193D3C6697039706762D7 + +OutputLen = 20 +Salt = D0E4425877B4874D1F1AB302A9B9E6F0F0715766F82AD00F3D97FBA0906F0F6996EB652555521D4663CC95D6586EC13811F55415EA5BB9DED4C39CF32518D3C9F0ACB7BBA8C65FA2BF706AF96D033A02EF32618A8613CFE733C59BA3BB440B3FC5E7DFE969ED568EC7267B65D4853A5649F61BE8 +Secret = 26C4F73C7FA29DF6ABEE1B8E6A4B79ED8E2820372FEDDDB861E48BA28509448B +Label = 9FCE146203D20893C0C4CE26 +Output = 3FD993B336FEEFD35820CC3B78DD1702E7A15F22 + +OutputLen = 20 +Salt = 9B61EC23FCF89990907020D49D9EDB07BE56C4A2E75B259AEE637CFD0B3612B82E0DE740E4B4D1228460A350E819386A523D82FE87F02AA8AB48E7D7718AE468977D58CE63C6ED207B6450D3AAAA291B327485F45CBD5F0AB878872594F76287A1D92E543E1F2992B30345C51623C8BFCB6AD065 +Secret = F32826272886F1CEE024CFA5F1749F4546C9BF59F1C28C0B313499CAAEF6EF5E +Label = 5CF081CA93DB24B47F664EB9 +Output = 5FD94AD5742C20984276A5E6C61EE1897E51D436 -[SP800-108-Feedback(SHA-1)] -OutputLen = 64 -Secret = d66a4c9713bea88069aa7fa57c995e9083a22d38 -Salt = 77298af99789d367cbb8e23c7c46922b03f20ae3f4d34a28b2ae8a86866bc787e90c2ec2efc93a90d50e09698e7d8d5ecbb46c30fd0d069a5598b86ccbe387042a744e8a9c1495 -Output = 89ab2702ffa47d503cc5e04996225396c0019c99c5484d27e1bd35d59d2ae50438ff55a66783fde7c2a62cd2c9cd8b7c3122e3622cc77be7c5ca5e14aca240db - -OutputLen = 64 -Secret = 509d868c0a6fb5d9fcd18f1a149fe1d6b67494ad -Salt = 19132d72f615c439ccb5e2653b4a87a1812433bfc5289a0447ebe8036b2395e224ce831762893c751471da5e4369fa939ef30f7aac30cd140c8076fed72c72f6d98d2d49af3dd0 -Output = 0cc8014f61eb282892b4f0ed140a632544887221f6c85332733805285ea062ed3956d1082ab1a3756b33dac3f7b033d04ad5170f034c885bd3d56e34e4fc1d2f - -OutputLen = 64 -Secret = 96985461e383f88270a1fd9113ea54f0becd89be -Salt = e305c07dbf302c3c6ab7b4090ef9b7ef1448fb986b3b55a1899ef90aeee833d97f2bd3a8caebf095c7108c63e4fba44078fd02431ad072bcb9abc0cf931a9cae4fe4f955de6c13 -Output = 7573ffefb615b322e3a8040ec99d385e799f1b457883a21b1d74792ddba8ab1eb75735d11c1305efa3ce62d160991e64d0c20857a30d35061582b29b789832c1 - -OutputLen = 64 -Secret = f0028abd4da7f8b44764686913e863ac983a873a -Salt = b68f851143949953bf1287cdf47882c89768d18c4697b79aecfa57b7cf237b604015c3226cd0b3a7c96250d34df445e4329427736fe95f2e4365f59a8eff366a5eaf35cdc80312 -Output = 0291db786f701bb23a454cc88074fe2fb78b361a1f2d2168c74d63455dc86e7531d3a29ea9d6aab14fb24429cc10b8f7b7dd3c4fc7699f34257ed59f40c84a0d - -OutputLen = 64 -Secret = 3d6d1f7b082b0128d695556e1bfaaaa79a3c164c -Salt = a6ec53b802841d2395edcc698bdd0658ed31ad933e76cdc4a7179095400a2ac2c317927b8bf2868255579f50349ce704a525cafd72c7c1720eb9fa5b42e30a38c0f6609e7a08ac -Output = ffa95fc84fef9a93542f2f623dfcb9bbd235b1b11e7546fe507e9aa23ed0da889adef5a2d1d9e4fcfdfe741e44e856be8fd784a4755a3698bb092eac9a6a1afb - -OutputLen = 64 -Secret = 5e5ab73e68fb4d25bfead2117f4e295dc6040baf -Salt = 38c20d9d7f25174fb2e535f11c77f34a2cd4f28720edd76e838e955573463a698b4a660626a270a52acbe07afe67564ab27974fa2ee033ca768d451d805aec57e37582090f6aef -Output = 344c2fa8313962880bbd32a06cfb52e8e32b3e019cc9f36dc4bf29d036ff2629a19c6cd8a84cf1410cb83362f54ae938934a9eabb33f9fc7491116f03ac02bf4 - -OutputLen = 64 -Secret = 30d5c8543d4fb62ab682163dbb732a444989b261 -Salt = 9e6a4a8fe0b2971c530a0577a2b441b939803ebef9e97d45c02662c37872680af30aef56f912a40397421607c545469fa0ed5a8a4ecbeb04218f8aefc56139a8b5d6bdd6d237ca -Output = 16d5de261cfff6ac40483907e5d4f2cafb5a9729dc7646a18814845e81bac4381a9a103af1f5bcc69610f788fc7afb1fa2cb0b4273c4d78c68710a173b3848e6 - -OutputLen = 64 -Secret = f133262ae845c8e9a85def5593f50bae024a19ef -Salt = 6a7f7b7df3bf878c36c969c5cc94a7e9a4c23cc64dd02fefc78f63e4cfd56089af057c17e16717cb975ab7d0e9f3d19d3d4d87c4e87781aea2d5f6658d0c32fbc376f2e21ce1b6 -Output = 272e935ef3bc1099cf6b6ebf2f10c46803efcd441119193c27db2006d7d65e771fea0935a16bafe9552ee24377c9ae2a973e734b422790e72dd6b420d559d6dc - -OutputLen = 64 -Secret = 141c7edd0d82f925298c09eb5834ee9e50f2a1d7 -Salt = e09c6019c154ffc3dd685547c950fbaef165e6966ef2b8fa5ff38a83c4e72e6af24db1a98c4578a57e5eb3ba9c5ea2123c18e14e06373cc1e48c0a80cd0ef7d7f08d1705881c0f -Output = 74a9df258949fe31c7d411ba3fe52625d2395b7cefb12e19853d7955deb9cf55f8009ff010e734755904fd93253128131302fabd6adb21e82d02b977f0804a76 - -OutputLen = 64 -Secret = fa6a4a60805b62eb340e7b822d128ce754129a71 -Salt = 9321f6e7178e3ca2df3d231231d81e3f91fc17f7635e6469f022c2a13f7bc1d14131c66396419a28d69bb60f33183e0fdb9758f0f4a4092891626dc75dc780f027c14e2432dac7 -Output = bc493451ca17bff0b74de4a234338b3ab064ac76951d3337b50762ec172ce6bf5adc02b760ad950f3457ad305cd8ae39c7ce4e8b67769d83182f1b09a1305eb4 - -OutputLen = 256 -Secret = bf550a7561d51f7636a5be104019b4e62d45ca99 -Salt = c93c96526c742e705a91dc5285a452f541feb43b9885fdbf8db198d47d5a7cdeeb95ea160766a69211c7d73bec3ddf3c13cad176502e823574937cd8ddcf3d3fb211b165933c02 -Output = a1dd8dc61a5d4943851df7128769e6e372673b5c20f6a5ce876bb45fe877e1a47b29551cb5371d1e9c17375c43fc9540e17e397ee30dd599f3f773cf2518d02da0099603703083b349094056909dba1b0fc1a92320fb557d0cd3250dde7eeb63ec9488cd8d963b9cccdc8347cfb986a6211489ffe4c8ef63e91dc89ce9ca321064a505e35d1b10737e44f82a6570da34033d2f24a145537835d8850ace095be8b8b9ec2e68c0d2635942ebae4155467f463a6455c68a6fc9735543414f4cbe019446e01ccfe44ad45e9ac9608c807cc7c35427bf59b67add5fdd654a1e30ee672b47e69291ccd094cad24d1d47b88ef213feadae5acb18ba2ea0dde0c775375f - -OutputLen = 256 -Secret = abe5c74a67ed3be33f9d85abc958db2f6f94acff -Salt = e6aa29896df13b9b92080d8a0c5de55d82e83a2356de9e6999f6491bc4e46bfdfe90bafadfe6430ffae9bbc597add66bf634fb9c661dedf6c27836d9bfb8ffa746280dfd07932b -Output = 05de56eb428d79926a0802ec01f0205fd7158852f16968d8ededf1becb4a4af417a26d8f0847831134ac27a29d4f2564598338603a4db3d2cce5cd646e9e6294270c73dc824df40d2621fc5c4b6b9cec25845ddee366c403d1131f5319d3d5dbfae5416041f9b63d9ecdf442b289feab426d7da5edc923df6526d197e61501ee1de8130d156a1d98b5e0413dc96e12af82243a986a04fdc8fafe8b1717df2f37a7b5874d34ab04c38e058d7c81fe63c225e03018e88dee0a57c162c0259bf21dce57acc6dd978a732a86bbe5238b9cdf0aa0fcf23566c87cba5df4b299e736efa01193163e42e8c5118a8433cdbe497c13d8901a3dcccaec6c27d2499383a9b7 - -OutputLen = 256 -Secret = 00a34a63a6ac20f10e212a377532c5a1a7e77e65 -Salt = ce9b4c2c1f3999aa0e17e8c481d994cd1d3ec161eee0e9478cff16fc602ba0eab9ba762502bcc548c46d8a66c59111ae5cb27b27c4ef1717481f72938a9f4973661eafcf3157a1 -Output = 1854961e659c4d3225b558890d93b7178a0c1930f0631999170f8788a7ac2229e4e2cbe6b21b871e646b8e7f8f26ae7b75fb867ac61063e9a50118b0d95ec35d9ef23081a0687333a2768f8408a6c056c32d5b835fb785cac1458350d959e50ef611556d68fe4f53a35217047a3f82c075cd44156f7b1b0ee9b11efabf0cd4d7007a186e9d1be98575f853d6a42ecc56501a013e6762deb8ccf58e15becf4f95c2ddd2bad7235e0cb11aca5ba58fed2653af98eb503654d069c184bc2c94e2a6946d2ba89696d719be7cb2ea84a6456cccb29f42d91320978508b7317fe9a12ddb23a47e295cb5767e55174c546880e5cbb0da0bd5a655ae715110bed5a09bf6 - -OutputLen = 256 -Secret = 889458deb0e255278918b19fbda233ce66932b5a -Salt = f63bacff8ebf282b14ba2b6a4b923a25d384269f2ae6396590d92ec13e47662509e4ff34749680389e2bafe4bf205adeffe875405cacd47d5214a4b3f20ef7fb1687bc3920f768 -Output = 545a5c26c9f4e9a14fb0c4c9be5f95e06b50a7244dc0149c90864d0e219f23128041bf0b7ca51fb8647a195809fc0b0c57f3c5ada7da6969f5a851ee5d4d4d2039917c752c2c814201015de2834239d4326552c1afff59d5bd89f15bb1623e5df4e05cb84d5e3c7f801ab10ea58a1e0b4be08f04ebc2a9793a775b552d7aa738e2ec17cf0221550e43cb09181ce6373d7c4a3c1570163991e9145e2258d7e0c64a6e8ab6fc78322d63ab1efb25c1514da1738f5522ba73806d5e71c29d0912a10552907fc1512206afa039bfd5132d645bd3fd733af293b879c2d107d949527cb09c5fa31d3da672f2a0c97a4c6a1dd40f3be220b4f8396545e198c65c324aa8 - -OutputLen = 256 -Secret = bdabc674957c07de104952ee3098ac3fd61c1510 -Salt = dcd2f7b50a5974741d0f9f9b2eeff5550e5d4617d44138d54ec42cb987d81e1ac353a8d5c3eb5414639bda297c32d2f0f56bdaa198df2ed97c4447823dab3d57665193f7543571 -Output = b3474d0bf9071447147a89cf6e6fb50c6de1856f7e5c222c2424b93ebd7860670054977c2956ae0cac21add5c781ba32c8864a02a4574721cf161b848a8557180a011a3328c57d168c57208ff3e15c967fce96daf1b33079c40afecc885f924ffe0792a0609d18db2cf600a4a92b21139017de0060103a3a324d585b1f5c48f806d0094746ed7d3324d8df5a9e46ae6e3a18969350859f710e7e60b984c0f74dc237b89f6d5fb2c79879ac2f727a18933806a03e259cd6714d97c0f9a7c39d88b20cbe005d156c704a7710d296745d0d752d076f1105bbb1b1ad813c49af5f095e0acbf38003d32136387c53325e4d3bdd84444ce7e9f7db3545d2eee45d9ac6 - -OutputLen = 256 -Secret = c93e8a229bedce393f05622fcc414f08d2745cf8 -Salt = 917bb3ca40f62a12fca09eee4c2ad41f2d73c6a108dc9bca8207c0ec3b9281602ec76c6cdb7535fd0815d09ab08719548ff52a1fedf603370189a98adfce100794b66b74799319 -Output = 92108f0cb9191970d50e8e8561aeb1142a767021791b8fe6c801071c9cf0397b9aafc3902cc06d5fd10c4477382ecdb99a74171fd50a28477b6004732e0d7780e6172f469b33a4727ee4f3811133f487adaf78c839b4b89236d4e35f1d0426d79ee795025bf2f0c4dad91e21cee37fc9de43593fdc29f273c595d8cad476fd64a05f5feb145569b069c49d4e26272dd452078b87bf50853f5f0b94d487b5c65dbab4765754ce82c2bd63d32ced4138bb633d935e0ba726832d702deff93e0d3e53e3766f590e64044654e1e0823c2d3a5069f79ab12f791c1062f5e14c7c830f6272a1be62e59fc28caaf94b1e6d994b7dfbb24655221da376b231d2e9285bbb - -OutputLen = 256 -Secret = f29fb928684b908208c9e1b269ab649c59153cd1 -Salt = 70c3022552dd4c6e8600303c2277b88b24d07df09f4f2bc54e11dcde42d90bcf5116f7ee74317be4c05358fe660b68d3049579a7cf442520a977f08ac036575cbdd2afa36da65c -Output = b709edc315e7c419826774b9570588d5df0bd99659e6734d7638fe9aaaf03cd9143dd049157210278a7a1521143e28d8be284c11b743654fbd842e565f0b082557d615aca41e1ba855d4e41613e953053c47bab549775f967e7d962fadc053812529e64f77fb38976eb2efe2ea9620dac750d2306b07a9d186f4d903f6a418e29655273041e3661b20134df36f7d12eb103fd437afbdaee6ba0839261253ed2f3db7bdc1d9a13185e838ccd2a06d21b558d4447546de431b01a2e9eaa120fcd9d64305ee3b4eb7ed6dc3220f8483ecd5bb6ae9d87ff3ce25d9ed5effb0755814f252e6f9a664f8b822e74c500cc01d1a659778fb266580645bb83d8ab5858f5e - -OutputLen = 256 -Secret = 2c7a270f6573651bc84f454ad7add8a2773c8e40 -Salt = f5c1b331aa880c76760c200cf88feda98e7889c60389a11304da538dda0e9869b123bab585ac881c62ea1ece2936b0f1a8c5541685c508f2ca32052c6bc892e391a5b688defa7c -Output = 27ee285864f638d6494e9de434ca729a2d7d7deacf1b16e530f94456b69b2017e3e11e3f301fe77ac067e4b1f7d8ad8e3a280ac69c056a1916f8dcaa31068b96e513ea36d8023dee6a8cf9295ac2b8dd226831648c1a2f5b93f96c6cd9c91672f02eec9c3044a0d1375801274785a72a4526b42f89db3a0a0900ec6a3fdcdeba247e83e942d352d4585dc725d3151fbd027d4e9950e685d900c5d6383b24b43b496299250f06571c00b608134179fafc6002ae175e2faefac296b51fbc0eda68b8395efc97a56e05c5c03308937d16bc5dfed37d6ec4e8b3836d1fa79d42895ac140ec13b39035c3d0e65bd9b24725903494208d7764d106fad4ad8d74626ee2 - -OutputLen = 256 -Secret = 20893539c119a4c73f3277f5e0f3addeb94141f3 -Salt = ba4a4b6ab5f937fbb2ce0f01eeb521f462cc752e6b436fbda1020f550cc2f3e94d513902201f9fd3f56569b9db790f5e3edd8b705054a630dc7d3d2d152cddc18d1a057225fa26 -Output = cad6881d8285643fc8b2f8851cc3ef5da0822d179a29e01b760e45b8776f65a6d533dca195728d86f5f6a132dd52b330af2a0018d8261ff153b307649e2c1962e947799aaa42063ad12e22ad4f779471daef2cee579768ae188e9c0acd1cb883bd94e42e5f79af5d7ff5ecb6d3c0ce7c641e92efaf5377f34cd22686298cf588afa2ac6f61567a3fa241ca8271cc197ad1f7de518c9339f481182d8725372c847d5cd1a44dca4de2b921b98f7457131ac34ce82185e3eea49255af0b280a3dca4f97c7679a2c7d7dda1dd05d3646ece9cf2cc329ae110d9b8710b85fb91ebe885df6c96e3b6ea27f2131843dffcc28ebbd81668d10a12b58523a9ba679f536cf - -OutputLen = 256 -Secret = 61e4a283b9c24fbf12f09801a2f33547c35545af -Salt = e69a1acabdd492bbc5478617a527adbee730649a210fd8daac63299449880f41383c06e4c06a5dd8b364cc3bb65debdf8cd2cb98f1815122200dcd2f8cd35fbe0d2f80a4d5cec8 -Output = 8286d252a60c0d0fa3c1304d1c441fb2fcd68a879de419ad41cc7dcca972a288dc8a0c926659cf0aa4439466e9f55f17b4f83b0e5a038bb2b8271b67a999963b3e85f5e8dedcd476935acd590eb475f8502994361f8ffceaaed9fd7abe587704403184acf67ae3f2c1b31b0df7011258d7ead0809f852bb3fde2d069917b55e5a6ca30838115816152b172b9ca853f0f10c8cb4defbd2a96a62cc15b28765168e34f53dc2d0e1842b4ca855e27588c2325936ff94960ae751856f5b014a84f2f146d22214c6b9e7023896cb87458a2b27da8086031180b079c946a4cdf57d60bfa32451ff725ea870a763c06229d06df15de337ef859111119a8e3d834260ebe - -OutputLen = 70 -Secret = d2c161ec047adebec1890536309216dc3991218f -Salt = fe878c882a8f5626a83def4e2e3d0b26c9f9dccb02c28187018c4938b7731a479e46f671cb17a35245301458a4dfb63a1b3567f6fe8215ca7244b24accb1d1941230793ade0ffb -Output = 9c4dac56591d687fa7e07a733f8e3c65f2839f6b5857a36835320f20479a03569a3c00f85b637d7a14d26f147db628320d98cc7c2657a713c1899e58f2113d84d42a4f810f65 - -OutputLen = 70 -Secret = 79381c1adf0a9620ea024c6d5dfb5409833cab30 -Salt = 5c94e0c987e8227a7cd19f0645256ca13d43a58ea027da159342268abbd77dc06dac7dca64c47ef827bf702bd31a8e551d863b078ab8114c0b1d9168153bf0bc1ef80d54f68f02 -Output = 2162ee3ff206b8a92a6b165503f50c54147f940010f4ab19c0041b708291563d0c8ffd318dcac935ec525990fc28c1821c52ff18b8d968c323c14212d965da4c749630a3b707 - -OutputLen = 70 -Secret = a117b9fa2ad5ce91a2d7ae8c67e874cf7caef654 -Salt = 4eee948336fdfabd0e9a5497c963660aefd18e14d92963ab637c316427b7cac60dab6f441924a4144697407e2f1b1764b24904ab66ddd119eaaa7dafad5820dd46a7d9966a3dab -Output = 4d1d86dc474db9f9a239fc45f0abaec2efcca3ebc4763a0d6e44a4d9d076d41b85bb80ba46e0f5f0f2a356771bec638b6ed9dce7d257815e1dbe91d20c04d228a9a8707f0112 - -OutputLen = 70 -Secret = e95a8875460f896731fea20b56f90aaed31773dc -Salt = 5c187a4361d234d278ba54414b044b0a8e40d79e483a69169037c355ac20f0ca19f8b92d1eb21287f1f09a0cbb286a0b93b96067e9a5094b7f84f81d386b0d88e1c1ea668d754c -Output = 65bd34173a0eebd56b4e1d8b877cde6428e5cb926c2e55cd5353cb86f07b8339e0e082b6b7f6a8b9cd939d028cce6402570274305dd62c645bfe8486c7d20a6572c53c0c71d9 - -OutputLen = 70 -Secret = 380ccefe68fc0a3551898e0e5811b224d2b9212d -Salt = 806dc0f0cb9e979cd7310f9694fa90b591f2d88710c2ec0ec8f1a85fe5092239247d95db64dc2947ff32fa1565f4c5c7944f74626f2e1c1c8f4958dec44cece667692b51b67b42 -Output = c9394f84560df9802cde68b5ce46ea5bd8b705ca5bfcac3ee02efe97b9754653e9e73168694d9ba28dab5d8f8eb8852add6ff5736379cf2a63778e57d0a097ec0947daf4091b - -OutputLen = 70 -Secret = a497e7164a9f691fe6b8040faec82bf0de3c84c2 -Salt = 9811640df5b39315f075076494f12e06f408d68bf40dbb9f0bfd1d173e49f54a97c758329b83462d4c6523e3e8a3a6d24db7a189792d2a054a2c18408fdd5baed4702a3fa5d856 -Output = 8cfb3d4faea872837338e556df3ca15215cbee927a041c40318feb2e9c20354f738af12d7f0d9d7e520f8a5bb778747677f154084ab6c1bb7342108e49ec3c96eea528270f74 - -OutputLen = 70 -Secret = 2b4ed72973170e26c80db9e91bfef40c2a0cf5cd -Salt = bf72cf783af611d216511d4b4b7a74a55d8cfa97f47c26936a3b960e1c51a536f6f969a5e8d3e3e5c4b5ea1f4cc8446d8ad1cba9b20936b46a628bd7d93e3f7b42efa66f77a9f4 -Output = 329c4ab9030f0976bb4bdd76ea4d1f7f21a97e5573c1fc0044df6e897bb15a4cd35f491b6a5009f44413ca158607eb3ed38d5ec06bd4c95b5992e05aa5fbcfa53affb1480315 - -OutputLen = 70 -Secret = 233e0c4043793dfb9b6788b922706f43616f4abb -Salt = b80b3dbd8a67ae7a18b8ac1622a6c75cd617052e08cf5f68cf408481e4e0cf418afd1da51a9321abf8c09f7f0b0cd208adcb492712875ea55f99e8c81a4b6dd0b2fa514ca2ffdc -Output = 2563a5aa4377f65085486aa4e72fe05f780f16e84d43d4c75309147501216324d29dfa00dc1fbb62a27c4a3811713f9ca93a8c430e7422c626bf9269704b46ba90e0afbaa2c1 - -OutputLen = 70 -Secret = 8651f0d2194cdadfa76440e88c41d2bf6c1cbe6c -Salt = 061350092965313f6977bc78e1f9545d9dad319300c57ae8ac15fb1e5ac3d83ab133efac8e257c699c2b87787ff6ce963c74c23ae1c0710db3389ec77ddf70b26b2602bc7e72dc -Output = 3f93e0e07d783fe00aa6008eac1bd2e91d3e4dc1ea550e58457ffd6c60adb50aae3daed8a932cb79b2b7974f219fc1b01f2b39e9babbdb87744a168bd8f914ea88ed81fe447d - -OutputLen = 70 -Secret = 2db54fba4564502d044fb6aaf0035a3d84d1c2bb -Salt = f97b00984f921d72ec9486c094ff7ab0c26a8c18671c71c6a64a7fd237aa1307694980588b3d9f140f230bf6ece97538d5eb7309abb3971458a34b81d9c2dff17e77cd5db4e237 -Output = b7cc0f095f4c2ca51ef6bc8e4bc1010c269d4bc790db12cc0d3b2334da98a8b44e6de27d0c59834de295b8f4365b8564a5743a916bc46b2a798db0faa1c6a133543cb12f9146 - -OutputLen = 300 -Secret = 091be23bd5b8fd1a106ad8e5114dad8616f9b0ef -Salt = cf3835ce8850cbbe6f3edcfb537d49d771a7e9390b36fbbe7ef8ef6c5a655cef8472651fda3937daa62bfb648bff7b64e921228fd2f50baa38f80072a213d59815f6ef3a9b78ed -Output = 30922822844a2cfb06c73c6da06cb73b21d8619a8a52fd0538e5e6aa815204f70cbcc1f6fa522691d44c02aff5ea759eea6f7490132e9de0364636731425d6eb479ea3f9707d0e25217f57f354028c8fc524894b84518649b4b4fda81b7c865445acc2bc5b10368a6baa6f897b2973d988719c0cb8ad62df879082862a4eda07be10ebc1a020ae894c88958bbfec464ef108cfda18ccc765761d4c03565b0687e4b78c1c87547973b999f11337cacd824cd2eef00c2d809305b6b309b3526fcf17bf5a9ceb84a54a73df94b7985c63295eccd7be08618c8c11f32cd9de734984e43c61e4373ea85040b457eae85ee96d2a08d7d90e1ee8e1b3e469ed01787d373fae40f1e1ea263f207f4acc52ebbe30c33ceb6a2b91a620bed5ac93f1c7c829004eb9ed6b993d7e7cf5686b - -OutputLen = 300 -Secret = da60bf6b14f728d4d1392abefbb432045b0d618e -Salt = 7438bc378962d179c8b8edad4096882a06ba6352c89d8207215ec30899d784c6ceb24b174fd124c695c3278022764ee8c781bfc4bd0b38fc6fb04b7e7ebc66955e6b3e9df1f257 -Output = 89c6912da2dc6606168cf8de27c239e51f22ea9ec356bdb56f267d22a3761552955310a18fbb7862a49e77ba62bf976ca0da3dcf59d8a49976243f21e9fb1ec97d9fe3d94011b81dc397deef933cad4a83446c26274d9cc67c5ca3449f1afdeeb37eacaaf35619be77f7898e327f9de0e678ffb71c07308fd7a5f6c5488fad6fb95fb66124f8324d4c6ce3e2842ef3e0532d08b1335b69cd9edf167dd0abee80093fa46e56806b79a8b3d293c9f739b5266cb1ad0cbaacf8e26eefb6b13dcd0fadcccb278e34f8d54a61f2c58133186242834dc904d55a47a7c5c5b52e12d44babbb3fdcdc0e65d2f670eec592a89dc19d62387edef85fd6c7388b3bc7e55d03c7b0486adcb819fc8858a43b2211674b53bfa3aea488a43bed036394230cf66c895fad7dc0d0058f5f5817fb - -OutputLen = 300 -Secret = f25f2fe1d4ef720ee04fb2957d0c84aaf8caa5f9 -Salt = 9c4ec5ce789648625cb128f3395c2c1799c6b75e8da8b6afe6bae5ef5aec68e142cfc34f76aa565e68fde2f320d4677040e77af40777aa6d246f86dcfbf5501b77791e1bb41705 -Output = 153cb5db05bbe2ac2393d3b5eb83c07856dc710e6a854c3f73c21c01e7c493be199c589a0d9e16413843a2eff9a0a081f5405afd6a6dd7839cb1959b0d267c9b2117ef94cb425ee446996b663f3ce424636356a3b83670e0d8299c1f44e15408ff77218eea7397dcec6fe41c6747057353ebdc30b3c5281f615718b1e511693cd5b8935963efc32079abcfa4cd2d4343dbcc6fe09e2c81116c5ca84109da7c48d7a07bf9a70afcd35758dd5a0fc5332cfde301c24ec84a23678777e879f4966b0237670c7c39096e74d5d701b3618dbd8d89df83c6f63ea28f57c350dcb8ee3d1847016bb4cb8f2ca2c9b710ccac3f8dc0eeaa64b2dbf78f5fa1f63bb6865e88307655a0f6493cabe7e7195964bd2c9fea434d6414d86aacf197fcb0a49aa9f44f32f8adf9ff2eac7da34204 - -OutputLen = 300 -Secret = ad871d888c35d989ee1c77dfc9f1ce884eb982c9 -Salt = 1e5338b7bd4db2d88507466bfbaf9d48b8a1099126966ab89e3d6460c3115a1d932edb514ec46a8edbfaa226dd2195bb2dfbe8a358c3342308c41f4815cae9d8e31f2f6420eabb -Output = c376af27cbd8879799cb4aa4e98b8bed97a67af6602eba1e8af01355c1aebf34a658cf174366a94253279f120047bc66cf0bf174705f9a3941621e02839602636e10d9f46625aa110fccc582463cd62cd302a0d518da23d2d8e7fba6dcfe7c663c4f5b36f43e5b5b37bec4ec63e9955ed2918f19230c87111b35ee8a012f882e2dbc50fdc1750aa2fcf1d35ff400e9e4232b2df643178dd423b72366427c64555ecfcf942d307953274eaa5729526dc3597ae751b3cab6d10048b6fbe43cd305f25e8a534b36c0e0ad62d8d5bf3a1b98978fcbd1c822d54439ac95f52cf520ecf5460a379067414d9720e869419eff6e5d10d0ba3a827c648e0472dccdcad66d5dc0341b8052a726002bf319766e3a701046a5d83643c17705df0b92756169bdb542f94adbd92dce8e6504c1 - -OutputLen = 300 -Secret = 04e2eb99fafdbc78d6aaf78c110efe72f6d38888 -Salt = b8e0823252acd5461d219c55238df3f8ea6588c4288873f35db447dd9de9422afb5540f70bc640a1c6d8a331bf0d86a35d89170bb46aa05eb5245c4f4c3fbd9051da1c5addbae5 -Output = 25cdac7511c37785f1884ca7c281b046b97e37f543d6a80f9163d03a4cdb6529e93cf0bd91072219d99654c142eda33a44d5c27e9321de2272a28456f1fae4502861604a66aa68f2c9ea17a5c4fa399225efd010dc22662510140cffc1244044ffe6fa9705b023d1f92f4d38e5ebe1c41d374623bcf1f7fea882eb23c7c3e26f3e081c879060b17e817ef8c18cd417826572d663aa04237f2d4b34885c897a0c23a32bd2cc7acfa02230667f446c897ed03f9bdcb78253ffa0c5d1e71219cfd421b5a24e47d0efc612ef88ddcd72833079de0c098300f3dcdf7f198298f4d4cf5645e877abe7326415b991733ed7b6f405a2dcc53266efcf794e0777bedead6441a39120ecb64a9f0305137d0e01ef3aebbdf8a24183b7a0708b1095ededd7d4f821a83839ab6c5ebf3dedf7 - -OutputLen = 300 -Secret = b9d818df0412d81add69c458f7f1ef9d7baefb56 -Salt = 93894d43078a225376683c76174dc54e8a1d7a7eb20f7639c6a07ea5241bd0a7fd5970bd6d8993c07961dfc77ea2d25b5662c7d862f5be06bfdc310a978bfbcef7714409ab49a5 -Output = a0e973d0ce0a28de8d83e85d2494fabdb319ac0741db5a5a99147ec9127f177b3f5aa428866f36582e6e0f082c0881d254c86564ae67649d06e0bcef4cc72dad16ca9b49d321783f7fedfd5134c3bafb4f31d2c14edc3ea945ba25e4e1841833bd75f5cb0177aa01950fad92360e91835c296f6457c681a8782bdb35920e01598a92015bcee820cd34aea745fe8209e6fe63041bb9e604b318f0896627cbca34452f706226e7051cb4028050ebef6e8d393cf74a7bacf7b2d0e731f1a036744c942c5ab309829dd812ea77edfd88c7d8b712dbad3c17b67285978c04ad0670c52aaf6434cf6fecf3438fdddce7cc9a0283b2ae02fb41a197c5a0f917b0599e167291de03a1af8810a4682d03a5172567f2417e813d8e32602645d4a6a7ddbe06c3454d1808588820d061f415 - -OutputLen = 300 -Secret = 7accc110d4e8fca5a87069c9c72d08dcddf7510f -Salt = 2d6f0489d3ddee397d53ea9d6252add0b7385d428d197ecb0ff0b61eab1d7fe37c19c271edea1e290aba731a2726d73f1117bd72545544b9054f98a5a1b6306994c6b5dc56a7dc -Output = d470267c870cd08a00e1c7b310eb03578176bc7ac9c2983a018731b351c40afc0059bc5cc6ce2babbdfdc7d264155b94ec60d58a42b34b47093dc677b5c19d7ac46d3abd7b7c4003f4a9c01c9a5ef80ecbb53f27a71736d2445873cf7c0c4236d785ab094597588e8bff8e34e3fabdcdb2c7530bc1b535cbdef1ca2c6826c18ad741e98a219d9b25ba83d82dcf9d9287c6826787e95b6d7c750ae2de2ead3355d329a511c8edabf01dbe9c78839fe33dde6ab53081c579f0d32b8278b0076425a486a5839c9944d82af8bead456e3985d75cb739d66fa2245dfc43710eaac989a9e3e0a01232ad95775e51fa6ebe1c4287b47b4a53ebb91cc0659bb95ff6cb879b3b565431039d0c44be169517422cd463ed245a57f1039a0089d1b31474e422d0de998e362e6959c8a4df7a - -OutputLen = 300 -Secret = 88837b552779fea3fb4201cb8d436152007ef572 -Salt = e31975dbcd11df28ff2811dec10eed28c94b63d90b065ec7e15663c298358188f620a491edd14779f1cc365c65d8391097e27646f5a730aff6e1176cddbd1ff4bdb0f97628698a -Output = 9b7d31b06acb97bdafb657ca357710ed5f382b4c62a0536c9b7855c977dc16a5d3dda06e9fc7397234384d463e9bc95b8ae8637fa787a054f620cc11d40367e4611ce1ffe617eba669a0988c2020dc08717cafb9c41dfe4816cafdb6760ae12663b62fcb39662e9d2412cbea4b6e3dc64de387b98e60ae7937aeb00cf7e463fdd1df6452600b31a3207af257cc947db705fa539376fd76becceef7069983cafee47aaf1e6cf72189b76d7e72cd933f183450c295612be070154460607bd9600ccf3b4049d7254074acf8a5355389bcdb56f29e3b08b7d767cb270cf9ca93852ec2a2a42403dc0ddb74e37a2d9e605b49d663bbad1ca3980c3581425920e7c29bd0c0356b1e072b129cf5de4619f66abfa088ba330fc67fc8462fd00cceb8a309ce31d43e457d18332b107309 - -OutputLen = 300 -Secret = 8428306e0faed2f32329c0a1cf0fb679322dbf1c -Salt = 4101a6c6da75d51133b982a109d300d8aeecf320acfb23e0f61adb32a0ff5db8f336aaf44b0c925fa96a663199371945ae40f35246cde948d17814e1696e7e43e97622bbad6a07 -Output = 5714f04ae9678dc7d31b2a5ee20395ce3b8309907df065ba6cd9661a9e1084fb42f7c01a2d503cbd3069c2e63a411488134ac69a1745e0e7e99498c0d3f640a87565e201c1d722adfdfe376bc57f5cb15dabf1806a3bd6bcaa11024b2c7f04da494cdef3059fcbc0d9dad21377bfe738bd01b2016d070d64d38bac80037592ac8e8e37de9cae82a479938cbe19a90267eb5a71a8cdf62481e7a7f26a3767a53d2522e8207e6008f5c3b629a0d38a9ed1680cf9bed2980f20f20bb0d693ba3cab656fc81ee27db9011cc60d9dc6b02afcb6087983426d74c4a67df6b93b01bd2a9ee2fd307dfe08afd7232896431cc693825d7b60444423657345915a341dbee06a9898389efcbc68a93787b554aad26bb3bbd96454daaa0489147942101ee9b89e84e088ab95874771c20008 - -OutputLen = 300 -Secret = 08fd4da4bc6afd3558edb80a55b0d54c80317d0f -Salt = 030415469ef24c9cb3ed02fde24a0dce1e116e0b344964b19703d209933c03a9fe26eba1e26b6c7bcf2ce9d23c90719eba1f0e55617851a1077860dbdfaad411cd2bd8f389367f -Output = 793bc5fbe7fab3ca3806dea440614aa0a292254e451513b604b718c4e802b7a89d862a4bc307737eef858d0f7c3a69068408229ec06393968ca4e0d565fbad10aee6a07b1542ed4d42a04732addf9599f96f622bc0e6e042905315954b60a24f0dada52c8512c60cc5fff09aa78dd49c34d3d8286be0e619dda839f50bb3fa1e993058890d75df06cdabce8e48c3bd4c4626f83bac37ec4994f242f8e5b56e91ef0bf3e2a2f2a2d13878f522741752da16585e70a3611479ed287d5fc8956bb19afde6a6b8f79d503d6b811bcd6420c24d04a17059a3699650220f322c6c824e0539ab8f060dc8eb80475f744ab2beadfa1eb7d5f85c4a1c8f88481f8cde52f177a6e315232a43d825bd13237d35a6c20c76c75490ddb1395e74f5ab0a654007e8b1bcd1e7e3a6d6a912c7de - -[SP800-108-Feedback(SHA-224)] -OutputLen = 64 -Secret = 011491189b1b7a1f9421f3ab49c6df9c7eeecf90f9755e8f6fe4f83b -Salt = 96bb04862501c955bc566cd311f44300d08f2106613bb50f4bd8bf96af3c742825eeefeb1fe212d76869f217d00b93a5c54bc93e838c891ebe96ea76ba13cae5189a4b95ec13a7048cb57aeb984c7f -Output = 0e8690dfd13cdc5d2e104f9575b90b2f864fe3e07d5f5656aeacd44ff97ac81b3b3c29e013e4f6ad896b9933c03d837b81f5943928d2c206103ca43228aba8b4 - -OutputLen = 64 -Secret = 058ecf7ba5cc5dca79ac7340a35b224b08d576d84f9d0d74e0428eee -Salt = 14720608fb12c1502f361910366495bedcd5ed1646361654492163493f4307532c932145386416c5f98ba7e610c11976f66241adf16e4e4d224f23105ca7b8fc008c59b769112854244ce9c7cca9da -Output = c46aa3ea119102caed66d5bb035b42ee9e35c92cd4cfb3e26b4a431f0125bd010eb9a1fb8381a8707869361a85bb2e967d16b3d98d16c580b78900f886ff819f - -OutputLen = 64 -Secret = ba263d9bf4b56f777ccadacd5b9b0d217c5c83c06ea12396242b2ae4 -Salt = 199c448c055fef2dd5118fa4bb40a5b34b9eba9333696356efdf81bd2b2eb13cbb0d664a764b2ec275b8d9af2650bed53e30b849783efe941485c281ce256dad4d21eb754d546e66026bf5feb4b921 -Output = f8405576f4c33e32f34f6f8d97aaa8e43243d7ed82d5f09d7f7e7b4646b418b4deae54d311eb544a6f85f3d4077a43754848f056e0c915af4a26732886f97996 - -OutputLen = 64 -Secret = 7529c1537fd1ad59010ea5e0711054f9dd9160c8836bb80c54aba22b -Salt = 4f0452030afd4b67f6b23159553c0e2cd833a6abf5d336fd42a703717ff740201f6640e23221321ed5e624cbbc955bf341023bc31b4dd7274bf55c49e95933ec06c39c60dda58c0c8b156d5f6ee953 -Output = 0f832c08fec0f6357fc797b5eeff41ec0475285bda6b24191e5273103bbfab3f69c5ad9fb74846fffb77a232ffa684987c06bf62d86bf7b6f282368e724ff882 - -OutputLen = 64 -Secret = 98525ad677ba43a37fa07d2dadc9ecc5ef060b9dd9d92544ecabeb4d -Salt = f7c1df4e5405e077fc9b9764dc72928a721c80fac5103d302bd71b154f92da53f22ef0b7ffaadfa7a374dc15585859004a0b9193e88450c33a9c323c5c77ce71a683e9bbcdbc836209be8053e4dc0c -Output = a9742f67e4733484a360e403cff0604d70d8be4de06be38e3cb0e1a55f1b71969b3ecfa5d062170224c459db40f536d907731e3c985309c967dbd443a3efae74 - -OutputLen = 64 -Secret = 45cefa1b1782d286a800989f3c715d7a2047fed0aefc6445ec8073f4 -Salt = d2f88e6677f538fbc505edb930fbfc7d99e29232a0f5e314c658988e0f550c0fdf9a1d29c54234ba0b2ca82ab6afc13761db75764b2af75d8f8f8fa62de978d53a7db49aa76443df44706ef3629983 -Output = bc7ecd6103d6ee96e37af0d1f91ee30f9b1400c76fb9333298281b6407265c67f2569fdd845551db342fe9584bb34c9fdf31bd8b48dd554707f2c3b69420515c - -OutputLen = 64 -Secret = 8ba47f936401031ce4de5417cca5b4eed262525de6d9d78aaa6c14a9 -Salt = 30555c818a76cd333b3578a3e9a38756a1d3ce6a3e33c92fe91e01351c96ed75733b717d67ae139bf73961c58635d89bd313c8ffdef8073d95a06b98871baf8238d3e2c54cdc8883374cdd802cae8e -Output = ecc044f3b2ae12903cff4a9c9d295ad926c4a4ac01f647a8fce4820ba4f53be57b5e85674ac58b54c36c660a4b9cc7325e2941de502e75b239ea7609b1ba1205 - -OutputLen = 64 -Secret = 3501e2dfdc3efbc3f555708f0728d4c84e2106c96d492365ac172769 -Salt = 8f7c2bade0fcc02b4caed4de7ff4655c5755473bd8ef1910351d545f7a992296dc276ea8ab8dc6b3dbadc6eab8187de927ebb9c6b90ba18b1359d3851148557eb115828d3be55cc445ebaf652871ee -Output = 21628961af9e5d00d1743a7d958d720ef90fc36f81bfaf1a30cb6ee9453714459d2041eb74b16ed3df3c306b6b09142304305c1dab74e48994d9d4f9a9a1a91a - -OutputLen = 64 -Secret = 6c58bedb5fbb8d11b56e53819568fabe39ae91809d0b52994a4a0503 -Salt = 5d5f1b2a4562d03bb44f11dd8fc74eb6c1e33f9d6cf36e8b5194276344b10258555d284870720eacd18ac7593d5694792fcc71e09794b70b01da01bd5f5cb0b2b0c9c5bb0bcac35b653258856949b8 -Output = ac90fdd4513730a4bd09bd82f1ea239c480ea6328e2d51e63cbce9504e84703ae660775e808547768cd801c314b9f51dbde9adf102db99c7558c97d632195583 - -OutputLen = 64 -Secret = f0ab3c56397cad4a096366456d55afef195873dd99427f4446ad3c30 -Salt = 8dd8bd115e2c523558dfae3928666902d4b55bc8e6f5c35bbcc334940eee67d969d5c39dbc3432867bfc0999a340613dcbe0c4828826cefb5184eed984c84e03e8e3e1d9d854ddffd5f9e523649d03 -Output = 7c8538e27be8f1955c71c7dd56d79ee68b195da4c957e410c2cd2914a7861d982b5f3465cd5bc01eab8468052758b2d9422cd5bcce53757bc75c10803751e831 - -OutputLen = 256 -Secret = 71a688701e90ef005cd1431f808db44b72065b2b01698f274da04f81 -Salt = fe364ed06df6188cb08d81f04fccf3958c2944fbe38b243f161be0b8b7004ba7dcb8c410a17189d9505f54e704fda3755e685c5f6158bc93633b2dba99db04053001c7a080261e031ed525173966e7 -Output = 81265f66a764cc387416694364aa58d7cb63458025d29acbfbd5aa73d44eabcada1731241d89dcd5f07fbc27440adec1f7623b18607c491e7ce3bd4d3d77fe1925ee358e5ebd2ddfbef04908b4942d54d4aa699a0ac239cf46046943d46c7ee58a1adf11f322b0c9ca94a6ce3c645c8969125e5b4427b3eea0bbd12e5ce202ed7531ae193387fb87801952f56bee8f8ad56824486ceb1bbd96b526dc036a2939e9e33dd806af21ba9ce132c79c4a0b2c758568f5b7c7bcce05f04e25a6eeeacda3a8ea9dcf65f9a51f8310083affb3229510bd049081763b0b7d322251127f017dd78b48b600c6535b7d9c37e2699a070badd4a56f8e6d206f5c49b1a8f8219b - -OutputLen = 256 -Secret = bc20cb2bc602043ba1b7884e4a504f623e27fa275b7fc6e884c39b1a -Salt = 9bfe8b5f5644d366ee6c26d5dcb1df43699d85ca195c7aa5ed67ae049fd966c319e0eb4dfc0e12140881a969592cea490c69bf52999ff23f2c63ede11a3b4b68fc1bab46cddee7ee3748ab16720031 -Output = 52d603c92aa6fc28ec077ef5850709f4c2b2955799d30e69d22a93f2dbb3ee99aef25319c3d2a6f3cd0c2002679418cff3d5c481af573157576f235501166f396110f3a2c8a0b27ecdafd16a038093fdd330caa55077caea0e7fa47baaef8bcd8c20c0e5c9ce983d69160649b32406b44d15ba37be55c62a97bca8dfcc2e704bd8a9ff45622b1eff659bf44458c7d79b2b97127696f2c65b2b9abcfe21bf99f30b92bd6d330c0351ed92fbb780afae0cdf20820879e0fd3f5a7d0afc46cf5a4632530f8ee076cf92f5b12e60ddc709db429089de2589add21e9fd0872672ff5432d028fe4e1a619ca6d87c481d0049bde8d8a9bd2baf9a8f1870e0bcc9af633f - -OutputLen = 256 -Secret = 2b475a08017c91b33cfc84d1159614b762b21844b9699cbaa29a57be -Salt = 557a7feee0db14c36baf08eb2929187716daba400c0f88875b13e49924779dd812b9d8573efb791512ceb135333184cc2cad2ffb9618cff9634f6264aa68d18767f58fef64411a71aaaa555f84adfb -Output = 8cc0b9c211ff39d786fc0452bdbbe5d0c6a3a33fc831796faa0c7591221abebdab43a8eeaa1058f755a87372827ade30911c836001c1f0964972a49a28ca5970f4bbd56295a07f50502a0889cba8e3f2789ecec5a2ad3ed957a414658027d3a411e0f0abe7cc0664b404d667b1aae94a02d8f9b220f81843aa41a92dd729f16eb76ebe68089d25139b2c6a9de2d2aae95b0c522713fb4bcaafc200831df2af2da195dac4b8878e98be66ea14511fc8b1e5af228f7cce8afd47a83b35d269be5590d92d013fb38d53d84016c49fbf461357136e5e943d3a60e9e1b6caa43863d0e74b4952a815cb5a73c505f7dbcc0375c35f9c105ed55316e881bc17d39efe6c - -OutputLen = 256 -Secret = 6c65516e76f3068a9ee2c81e28f1e3666e5884506c507d1cd88b8f4a -Salt = 5a16f184ca2d6ef5f2ab456cfd55d8f213acd347f60e9489fa0a2c43ab63e398e99e8f2d631d9773dd689c243b0d93aaa1d8a576c3c0f1f1c4b009ccb1f9fdaa201f3727fe2e992b3125a240baee00 -Output = 019da7178350855556679db7511fbf1c36d6e38077cf35963eece7a5ab5d6d06973ba0dd229f6ccee7a615d52e5d14b608fe4147538c101f15bc06c422d4b555f7a363eecc273ed67a568a8b63fd65501e8e38050ff825b1213d0103ac3514450583b40a2584881c846e78a698ddf72bbd7fa0a1c5253b4cbd88623ccbd4987642fe815e6442f2026d4272764b6c7ba131fc27056eb409022e45640a12de138570f97570b5a12dee3e67ffa999f888c993cd6bd7d49dac13ea23b6c6812700eb1695ee6dc3ba949a23ede64287260bca98b69b3ca5e1139d822d27ad744b9a8007cf251b236d67145d4ecee64eb3410f38ff40fbbb7616eefcb8270db854f064 - -OutputLen = 256 -Secret = b2c1569e69930df69699f926ccbef927312a0613d442bae29ff387c6 -Salt = 40117a366cae01a3026e5810124bee9607d13d6600667fd01a21260db4ab3107add8d9ff3a107d43cf6f59fa11354283c58ce88ab1835c3dab0762b7c9058c820979965f2db15cfa3b031f494b5787 -Output = c49416a2622911ab2eebe01d58c09a3ed506e5720a2b615f898e850bfbb009ea53ccbe7cbe92d17744d3640bdcee8d0d7b5e1b92815711ad1f58c25b58cb05caa8332b70c366a03e37816f6fbd2230617ab5b02610727cd3a48ba007b4edbd73c6077590ec85d4ef4b8ccc04e4025e898001d811c78cc6c1f0ad255d5a67f12ddc0dc99cbbec7fa6837bc3720c46c895abc8e65c092c2b5d5a0f8c6e97b99ca13e74fafee337e12469016208ec0395feb56fba503166fa171ec23796cbdbb27cb443f4696c675e09d5e75181af18472f2b73bc246c75f825e80bbaa18a22ed84aa11562f021e628599b469883247db1b3410867bc68fae3d95b308f48226efff - -OutputLen = 256 -Secret = e9f142b5749888ae56eb97655b883a164a40f018e81175618f8d0d26 -Salt = f89f50551e907846f73b08f978258e883358f8c025bf920507307e04889a455a598d03173e389429924b49f39fac53898ba8842446ed7ddb1cd514f9fec0d7487faf99f5f2ce2ba32666eeaaeabebd -Output = e1c33c662b1ebd15af999d5cb49531e0f851b2420c096425aa45977607b9769a59e487ac2add7085d41efcb07c99c796faf1dfebcfb0968ed46e5d140576ca6594eebc6bda478079b7dde64770fd12d4093bfb911e1253c14bd56ce2383593a099c3ea8199c4a9d57728f32bb72c74eb08614965b3386085fb440af5fe49b8fa2bddea8ba6d0c224703b52ced9c9b5670b020f7f91c2139c6b85087927989571b6459ba616159c1dc0009eed78b3901ae79b83a9dc052cf262b8439e29a180f0fe0888bce16a3d18e5926f780c600657cf2b468dfedbc5e5034935f36fca837fda2cfb143872632cd9f0c647703abafccf5b41a506a36425cf607f1bd0020033 - -OutputLen = 256 -Secret = baf396f458433561b594a0f5910a5840421911d7e777a836be0ffaf2 -Salt = e365a2b10bdf5a3bf8e8d7d5810b62cc00c056432292854fc881db07f1ab54c5eff7f710aa51becec8f9867d0ac783043f23c280d50918a492d3cfc59e29a28f399410a89dff8f356b7e6a21e3cba0 -Output = b8ef0d6b92016d297b6d36c48e0906d55400ac4e3256c779b8b204cc9032c08f1b7b803a9de0f5ba7e6526cb78dff836546846abe1f1b63d9e9c8c3e1b1b5c99822a44ae587b16f734917dfa77369175bc5aaa7fc4f73ef8718d4b520654d78d5a6c51d8a30a78d0f71dd146af58d0f6421bec5f6d9e3b71242cff70c8be630953cc04d94e41eb87684e95e8661e361765501157daeeec2dfd7d8cdd93927d8406892fae1962c9407d0cf612f8797447439e4196e1bdd67311fbffef968c63e8340666d73ddbac5dfbac5e40512e76f614f354d8601f734bf150ab520528ffb015d927345aff1ed5eb65365f66ceba66f3d862780babc6eee50e0727b1423669 - -OutputLen = 256 -Secret = e53b30b0282831bc4c3c32cb24f06752af0d1341975882d1d75de658 -Salt = d02983f25d0305a6063bf68187f76d4f3d022227915eb80bf31eaa07a20f4e0122d2d65a6576bda481ad73ff542325f5dbc448b30ce52ade61ce3754c0076036a6a1270b1b7a05c7c25e04e703c868 -Output = 512b6ef20e5cfd95f471edcb18b2b41782f9645e1c88ec0d593dd8e83122eaac0842f10f5341fb7195614e8fc266c8c25839c7a1730fbbe5d7d8773739bf1c01a285b1846db0411d9c00798e8b9f635bbffc9a7aafbfb55a5f0894463f4f844eb80035674ab2608ede28c1d11cee0f6a00748752b629d03faf551b271784771af7c7755a5f510602a054dfbf9c0d094b89a1bbb5dd7137231a1c6a9cb10356d2077712183ffead0ec1f2ad72977a2e14700345a4b1e24ce1a103d227828287cbd2ef6be2201c4a717c859b4f69a8cd1be64e56fb1ad341c782b1adbcdb4d67b720c3b1e35261fff3a4cddd9e88785fab524ddddfd69348609ac482a85d50eab5 - -OutputLen = 256 -Secret = bcc7f7615e93322862128de1f04d1d595843d262d3ea87ff6e8be668 -Salt = 91380d41ad2a4aae7476df84e5eb6a528ee78f674d3d487ef52b1889cdf968f8bf782265fc8cce45a27bf1a3fe02dc3cc525e04358071684e0e3df780998f9957af22c91e98adf1b9606598ef55610 -Output = c9defd01d2bfa474e2e1fe9505765b20aa946a9a54afb6563fc2a9c3ab7510d0ba0e1d0125f0e12565ff51190effa55159ad2380560633cb4be80fa305da5835d448647441bbedc3d6c9257c7bb7cc0651d9681933bf5a4c1302cc317a775ff0b8f0a216ceff2802da49180bfb4ca7e80d5d09440d6e1df8bcfd16117b03f56d6f3013f532b5426f95735b1f014d8466be80c65e2f5830c030e5a7465fae193e96435cb96bd575f0009110625c638ec509f66b2c509747068d70d32664593e10401ac800396ceedf41b61c3a57ade502e1de06376ef8a99efcf90b8af86b9ec026fcbaf5a50132c372ccbc00b9dfdaeb6ef926b6ee67d2789ceae31ca3de7ec9 - -OutputLen = 256 -Secret = 1c92cc6683027ae4878636b231e52560f4ecaa48207b25e69fa15241 -Salt = ea2d1e6b98db15970a9c9f9bfb13c77514c91b8b8be9272a05b67e932538cfb938204a30d1d255c7e9bad75a91110a11e871f7f71ee52cfdfec51ee975666e269496de13b0a5c0443622f6645408bc -Output = 6c0fbaf0f7cb459078bb10a50bd4ad197e30dbb74d58dc4e8728a4f43adb2800c94dd7ab6199c58ccc8c0ca8068683c2977e951995bd7fb6488d290d2ba642280bdb27fb47ed74e53946589001d0fe1bcdc759946fdf6b056a0da32c74bb55d84e00943fcc4be704c6f264f0c2eddadf4a339f3a689c7c6f9f46fd56fe61ec0dc529f9f35ebff957379893df340def4194940a9f966380d73ad4dd77817d4e52537265967349baba80aec7211cbd16fb2d9346d7620255e20156d426bd0c4a8d27b11dbbf9b6779c8a8273ffd7e54010b3c4d2ab2ef41f3553b15b3e4c116b681d545b973f8ba3a460cf991b56cd3829418c40fb61ad6445f4e5b25abda7a098 - -OutputLen = 70 -Secret = 4c2b28b4bdc7aa9635b1bae0e4c21355ac05a76c4916e81c0727023d -Salt = 5e46cb35bc5661cc14d9066a542f154d51c3a7e4dbf3b7fbdf3e4412d193854c2d42b43f6d2816dc94445a4e395f27de6741729eebc39aba1772a1a9347104aee2150a11b56682beab2f50c0dc6920 -Output = 36f337a50c83c924663c4264016130a5c96762960c7bdb5454f1e04edc7b584f4ad5e13e0a0067eb8e8cc3c7c0b5810d04d0d664c0e2ab0df707fcdbe10ba11d67a48a59d9af - -OutputLen = 70 -Secret = 9d216f0602c04b5cfddec2a17f4cc425a6456a959b879e75801482a9 -Salt = a1420e95614386a53e00eba68167f89247f76b34cea011dc72dd23d31afe13f40c292b2a96c21e053cf3447a42fdf5756ee8f703dab21b04da94a6104906895f6c38c91f0d2129d967d203b2c8491a -Output = ce44ba0186c7da8ffcfcab4010bd0fe42bcd7cf8604194b2430e226e843cd9c442923654ff720e11206a8dcf28585658cac63fd1556f18647c9525f820de7286ed50c7fbcfce - -OutputLen = 70 -Secret = 0824a79939f4c22b4ae519adb10c4f977cd769e15f66c414a64d3492 -Salt = 65e68717544f3268dcf90be363e5405a471c17656ebaba3898d683b97f925d88de08f085706435663d110b342de7a60ec4a62288e6c82acb0362dc553b273c964d91219f764b3260a7263263dae39a -Output = 36c2ac063e50941ac2f6650f80c4fec661074b7d2e286e558ac81ce09a0d3a222672425db364af8389b08c6d6615b12436dd3c66df35f78bd45d8eb7ecd11a86d01a08eaabb4 - -OutputLen = 70 -Secret = e1e9e760f3ee60512f7d1362b945b7f167ac2f9464da81a8b11c95b3 -Salt = 33a454f11d31e281fc5725b825c211e01623de7472fdc80575213d9ca346f5bbf46d35a07a0df631a250b3a58e56f077b79ac00401649585bab5c5f07408db40519b86ee757cc3db0f063854ce18a9 -Output = 012d3ed2270a81b114f89cd71e59a307a1fe4ab0803f2a40db4155133d9aeb5083a6d892f3a972d972d9177293388b7e79dbf099fab2b239b22386227ff83dfca249da0dee79 - -OutputLen = 70 -Secret = 147d9ed1aab1091be2615a50ffc91a52fa67b8397bff82be7e5a1644 -Salt = 28b173ff7ccbff54c1bddfff7c076649b3bf7158fced969d73083748714e2e7f77a12fbb6988003f076a0195bf449cdc11aa4e39201683aa9a7d072dc41e889acbde7c3505f324e03c6865f9c12661 -Output = 3e9645afbb38bfbf0f7932a9ae913b96355afeba9e0baf0c5c878048f61372b4dafb8e3c50537e4388fdc21e9fe0b885aaf96954220507734d55eeb9bbefecd69e0cebe08c9c - -OutputLen = 70 -Secret = dfb63d0c5227f84b6a67f7c3ab78b65bf006052409bb16016132b3af -Salt = 328fc2aab34670b3a27870f9544162155dc1849fb8b1dec1cdfe8af7ad44917845cbfd2e39e340cbaba00f1a2e55dce57e2c39fd50d7f828f120021eea2095a6acb01dc8228226cbc4b5a5ae4ac168 -Output = 6e37fa365781b5545f40ed6380f159317463e74405faa6c3e4360367db91a0bcc0a8de5529f9ecf57bf5ae693348b06c5b455759ec61e4efb6f3e683c2f38484ebc85c12f531 - -OutputLen = 70 -Secret = 605a74fb738c9d5c2d550fb2d6e940f76eccb59d45e7c2211e953010 -Salt = 7b3af1c93fcb63c6e69326b5165c7f1904fcf0e675793db43ccae6e31210555f92482454ae5187a41cdf17b99e3a164af9f61b67d57bd3ce7e7eb0db597db756c94735d776207f98e831d6c2454652 -Output = 48953aefa35c0d00c41be5b3c78690d0cdc1c79ac8ca281745d428d6471c5a334a32e002f3e68a8c8a95c6cd77c7f91002c9ac726de907b8be14fa7bbdd7511b3d751b53131f - -OutputLen = 70 -Secret = d99cd28d9d65a6873c2d3f12354b01154c35d20d4995075cc01b11a0 -Salt = c1e34ad1e889bae82fea8b491d3974ac445692e5d29898ddd7a24443917179a69c661550ca4a328699398a961927f3261aabf4954b212ca520067449887c5fe5b36cc8eb5cd1ae39b9637b8982bfb5 -Output = ef1269a7b27a3304782a54f2574f9d4a1cc0ba809172ef05150c5be7814aa587df804a3e5e46fba3efe540ea909c61fadb2c4a91547d55286dba54d86be662019d7c4f55a009 - -OutputLen = 70 -Secret = 48395f642fefe01370f19d4609097a2f999bf494f791051b503fa6f0 -Salt = d64c72de8659eff5fae9f30ae9e5ed996783b14b9285d8c83f88cf51db410d8a80d331144110cf5ced0759b7a8103673dfec923d3ae1765e05fc11962012a5989ce75f17e3013bd8c1a855c9fa2197 -Output = 7f675a44d83caa4c37bd39d766238617a30d9788e44f37b945c39be6b80be1efd96b6c3d08a6a8d3970a9d5a3fce3573ed4a22d682aee99aa9428d554c7937f3819c2e3d344b - -OutputLen = 70 -Secret = 7bb8e5533d5a63772793009d53bb0b1c06b28be45aa5265f533bed30 -Salt = f2550e60450722b8699696a5e0d485d4eff307907d504f9669b35c92d7050f7e3f9045992b20ff2d32f2bfe1ec136646ed541aa633ceeff329e00a28b7cc8f82d8fa309b4d13615f6a3acfe71d527f -Output = 62cc1e1857f5a74a3ae1ee08b26134773c4fab477928c782896538182143bee61d2cfbedfa11a971287a13c930556d86d50ab9491f9d1c79b90ca68351259519f0f91cb1ab01 - -OutputLen = 300 -Secret = 79becaddef1ee7031932925b673fabde2031e8aef9b59634c975b5e3 -Salt = f44dba2f1bff702ef6b11e42ce39050ad03e0e8fa532a29663bbee3a6a8ec934a5e730daca9955473329edb60ab58cd84ac0b285c35b90ad87b1fb880e137ab4376a0b9fd230200dcc89e1c9a43b48 -Output = 4b8691a1abd81577c2b720e4f69ebe26e2e6dcc8b89d8d263f8516fd3dc3c803babf2db268907eaaed2722ac118d4dc7e95e11e49905ddd10e73a6bd51df30db0c08d15b8a313e447a3374eb7899c157241b336235f1c4a9ee5f25555834bc862237b151290213b709903af8209f58be39ffac668daf4f2d6641e0608052447485ee07046213699d3e87f202afe8b2ba83f862e4271af694aced9379478577ed10d52ca0f20c2e57ea822ea39c3f7fdcf07607e27a6b4d966568aeb017db369b487185100153f83e78e739ff482bac74e4e30c2f27c40f5c3eaa25f8043b62217325d8f6e007f63e5e4e71b3f4f54314921c1daa71e36f5b555ecf9237d3834dad7deac8887623092b93e77896b5afcb5d07ada2cffaf0c478344e48aa96caedec8480dd57e8cd91d0f1405c - -OutputLen = 300 -Secret = d311263f76bc1dbf808900770e6892ee61657ce938f880c2f5b8b715 -Salt = 44bbe7a9893c4848a5307406dfd329c73075129d1218cf0f4519a4c44c46318bb3abeb86e34796cc78c4d995b74db6707c2e12e0b360801a7c3dffb673a85915b233baaa835bf90c7e14fc7cebd821 -Output = fdf642c4100b75d49e4c399787afe0e8e6ca5a08be5e4c9408558482416eb56ca6f8b782d4c3bd2a4eb375c5026fb43a0bdb57019c798e10ea28f991d4b78470e3fa2325b9ea5ea0f4e26643a61b3c21eb9d5fd10050968a40233d26f75accb86691729e72869b9a7f36ecefcc298ffebca7182f6f00b5d59f8c9d36285016d84f92174042a135adabb4043a842fe8669738bc5177ae2cef701777b92bac07e6326db162cf5a7c04658f786497a9db384f660492e912a77824174761e215ec2447fd9ae220283d2c94dfad4007ca76a70999961e99b7e39546547d21c381899b17431d1a593c307caa6f79ee04acf813eb31298b20d257011b751fa3855fd62f42586c68a5f5d1092fe81509ae461222e66c0f4b3b390c38d8d8b4800eab6996a374ad8a5f773e2b5267f681 - -OutputLen = 300 -Secret = 1be321bbaad2c90a4a4a20a5ce136bdc26b79b25cfaf8703a2162cb7 -Salt = c54da8ef1d6c48ea0ca289ddbe10839bce130492f1b7c67e3ca6a096b77192739ba49fcb0fbb525a96ddc8b512c26d83b33c1b181ede39535a65f0c521a4a3f55ba0f616f5816a7beb133e5007c3b1 -Output = b8f74cfbd79d5c1c91266196a7f3278c1ed864c98413286b6587aa34e596c334005c7bad7290177595f20946ef7e1c117e7943b86b054a832f1a3509517c6831c81e8b284b85d83c7647f1bebea8c464747db50a96d89663f9007b8de8b1b3af30456104d91c5e58a1b80913e2cf486a9a1a0d3f6beab2359666681c3b256a31512154ac20b90a90f0d390d0c49cf87341804fec41bb7dc3cc86ce996ee4a21145cc17df06ba0c5caeff0672516e92fcbbb54459d0165595948a0444de19cd96a782269cbdb09db0588fd6c59aca8ddc00e70f0cd3802701f534aa00a967ff848137a53d7051648f4a40caa33f434d5e48f267e762e8cbf3b163c54909d9a031f63955cbf93d0eaa6e77ebcd3a174b288664826f7dd7d5188d6f1ff5b10658ace9208cad11ad2b988f3c6dee - -OutputLen = 300 -Secret = 90af4fe5ab20c711f1a0c10f250243c38c14fbd310794341624e4571 -Salt = 3902c4266547a7e8d4285042d4b46c2c0368df3d309fd983d3a861daed13fb902a554847d4d9132611fbc7dd895390a424b29076aa2fab258b1949edd8cdfa4dd2da4824e497b4be71f881e3857c57 -Output = d8b20c03d5e1b9124bef9794e4282ee946cc02d0b015bfb653e6543335ae075e262e885b3f56fb04cefbfadba2cdcb4d9798c436ff30ae1456a083101057dabc3d3055ef1f1b8e1e44b5cb9008858c521ece8b81c541d2b5f695bd8272a29f08fc6c29cdcd7fc5021ccecb0e37914bb03410dc4977d96847ebb0c598d7c982a6b13640ad874d0a0dc6139ff34135e24f2971976194a58cac33a1f0eee14c1701559900b7c13e778e8ee3304bddba0fca170bb681b8b766a407d63c475004ae8fa332781b247b5ddbbf2098e6d10581ebe4d5e10296850722d6c5139ea6ec35da57014507833b9c5014504d107945fdc41f2b65dcd219058bb9c24d43244672c61043fd149f3cc407c35f86869691d6c0b680b1aaad2ce206022735879a5df1d50604815259094f4edd6bcdb5 - -OutputLen = 300 -Secret = 6281a16033feac834438dd0b67158578244f6806addf38b6a61bea23 -Salt = 8a9e118a6d7df0c07a462549e7df45ee3f81eec200009ad1306de74fa049e505974ec53a3ec3a2f28d0eb53bba94f4a7edf681d668fe43a9f576481b0ce96bd7f2d3cd7df35725ed8ecc48946dd378 -Output = 849f64addd4e831c55a0cc9e740caea70e4741e4ef249d33f0a3c2ce6bff6aa283658ac521acbaf1392a0cf265853b6fc4a4dec21c8af90c3434f0196474b2f4ebe4d3e7117ac0af9777f716dd1e275514891478d51dca0b45ce0dbddb2f00ea87494c9f1cf21893bbd2039ec563767f8bdab5e58de92578216e87bf71eeb69232af10644322714b4106eb85317b10d1abb053f17be9808724eb5349582165ef21b772a3e14f5d130b6107efc7c18a4341705e87c62ad7272b4fd9a41a009b5606c7f2aa7ae5f6dafcb5a04e5a56093f185c7b39276e9fa70b4b4314e6bb00ae12bbb3e02844ba18e3f964711fb6c6540bf6b03e7f4d6c72cded3b89bc53e140b24fda53472c66932c8fe50fe9b7c67377f067371c6f73c5d8adb4a38c1a0a2536c6e6d5a9359c79058a3bd3 - -OutputLen = 300 -Secret = 9a4579199e4da75db01ad93bf05694b749818bdf796303d9feb5e158 -Salt = b3a03b7269c936da9b5a30a5af196c2282fdb05090d440b00343f9117dcdcb7071f2c21fa1e83af62e93be8b8385fefb71ccf0d76ff3696c677586b46f1824e172a6af327b153eca1a5859f3062539 -Output = f0f9cb0da241582c14b7e57902344465b77d078a541cbc9a15d1e72c0f6043737025369d5d1efa585652d552611ee01af3406f925d0747c2a9232effb67afcac91b9beeb97b6793e3fdd272fd19aac7b8a94383409218473ac218114adf26f079d0665ae5b177a8e061f9f80ca05f62096e14766fc1c84bb6da914df9111e3ffc0c0843cd3f1214d7e4a9937122d8829660b8c5a365380cc51ce73fd0549c0af705df651dcf5e1e5992167e2390afe6a08774ebda0a70adb50049a8ca6a0b448e5d9360bfa3a70420863d76f2c88496f98a1cabb5027db91430d724ff91ebfe98b8fcda9236d1fa9c1c2b373e0ed4617099a932ef0361573807f00284b105d09b969ba6a1e2f933a550871dea5dfa7665ba3cc3178f34b80099bbb4ad2678233ffc426e8cb2f695cb0007128 - -OutputLen = 300 -Secret = 821412ab4486585ba14b3dee8cac7465d3a35bc92aafac0a165170d1 -Salt = 2ea7790a4007dcd95794f3c4db0ce43655cfa928a12b144be442dba67ca828a48df6192fadc034d835f2e3bf4be3bac276a1aeccfbe4f3eb531377c28c1c6749b3de3473b262afe1bf95119f8b3fbf -Output = ce278a07406fcd86f0ea6770f7190fcfc5d5be0114a8c8a961a920264a3f2b379a8f9b3bc206b5de155c6e4e81539cfa23eb2c371296b7b2b63f75a9bf72734996eafee852d970f87fc1292138c95209a24742afe874abab08a95b0d44e7cc78f675ba8b1089f0b9fd2ca41ef2ac9fe59201183e3ad3a710d3e659b611d08f6c62d4887c841528adb1ad1527e39f628bd602102604ba23b4e1174e64f657d1cc42db2d7b95a4c066ca0ed959bf4f95442ad1ee66cfd85b6d278bbeb807aa47709cccd1af113fe14e329a23bd55396c48302cb60e9db2152c2f31eb8d80f54212727faa2c5d0df9f4946412783e201b7126d6efe02c241b28cbec9717ce10c2f619fe6ea7b5ec59d10c6abc5bde5664ecc861fdb64111bc1db237c441ba006bb9d6148c5a19480c51bb880685 - -OutputLen = 300 -Secret = 32312731aeeba12bed3041b9c420cec1e89c32ad2fb7b07a4e33dcc1 -Salt = 9c7c23b276e4f3729207dda077d5995a605ac731ee496fe97034f43a9a381c864f210897276a56d22ef7579ba8b42c0bf95d3ee1df1b45079d74c286feea852493742c6c7d1d0f582e5d580b94fd95 -Output = bc65494765d161781b2b36e19317351669542c322d39a0b13680ae45b8a4745455602c46fe928dd02c1c8e82ad7b2228e0fd75c1aee83a0151cfe75e3acef76fa2f101282a44a37db2081e470d53fe56da6527f1ebfa9b8c788fe2aba8b5c7a739c396dd152adb415d843007a0bf986be5ff424feb616670c300a9cdd41d1f1e891a6ff63aa4c4a60c06cc97b1df9aa4a748117040e806fe797b2474108ef0bd898c4dcaa9352b9aad9bde7cfe53bbc52c5e480472c415e5b48072f5f4ee502ef3921a970a4603cefe7e7e49d6e6e830d48cc79046748305b963a6a553608e02ec94325a8f08cf20f2eac7764b2246f536d5f761068803c814944f453173c115c6339b16b31701fe63b5d032af6820d1a06d5523f69dcc265a1c9f63b86183d02c007cf2f9e91ea666f019d5 - -OutputLen = 300 -Secret = 705511c9608886e96eadde3ed942bec29322a5d8f35babc432b5618c -Salt = fa2066db16932fd42b6b299a824acb76770da4c80d039993f60d1c9e116791b0b0e0fa772e361a200163b9fcb274556c951bbe8ddf59e674dae196201cf0d141426f829656bc5e4b5778c590bf04a7 -Output = f4735ee19564d6c0477af7bcf3e4b1abd1d7a535c0ea3516163d273e41a1751dd57482fa602526ca12615d9cc26029c5e01af22d079d3b0672d9c2dc108a88857319b457ec4d2e397477d5a91d220f436a2cb7d23cb37553c7b65d660417b062dd8787b427a8c76543d44f46a4a42a10a0a5313b16170297363d24259640da005bbc73ae4df4229d719a9f786eaa502144696b99482bbb767307edf96cc44aa821e37f8bafd71add9c844936a6420de694b15670ad56334cc8c49717086426010f86db34f3cdba8917f7639f3c5e05b08002f89ae856faed8960666ff380df5ed5a7b54bb172dbcba57953547d20bee046bc670ed6e7728bb4e1163f4ee221e529c609800f03e74d145ec5d5eedb745bf9a476faf1e3865b1885c1ab9f82581c2aa0ccdf97154e247dd97496 - -OutputLen = 300 -Secret = 128dcaf9f5ad96fbb1b2e1a0ae8de7959049506450284a7deffeb505 -Salt = ecd79d57d22e349c8c73336b952cfb8bbc461c0f207f6dc458b5943bbc4653afdd5530a01064a57b0503919a309a7c2af754780b376b282d8834731fcec2936a95f3922017d4bfa7b9694104b5c359 -Output = 2353e8fc9f63c454e80c4084c58f81ca86a93611c97948e6b74bc622a3e20683251eaaf5d57301ddd80fe9f1949ea74d768800121a6ebfc46f317bbc9455fb54a1baeac15595818cf134608bd6729624a15f3a04859d1b000aa8e5dce28bc0a65a9615acc98ab19793be05b55a4c504a5ee3cdb3072edde15e6825b3f8c24106b40464222ecc75a5047a70f27d6f411196de6debf996faca9ed56fef81c145d99df4566641df90ac0ac0083eda850109634713e4ab5179c572e23775ad448ed4c08dc902d2cdba13c4b478d730b2c268240fa6c920e1cd720e1c760b4152f74858cf8eeda246b1aa611ced3841b6453b79f335edad5e4fe8b0a0eb9c8937958148b2be86bb87409a315397d8b918468b13a7d518352a6488908de801be1f05c11be7deea9f2d364ea34e7491 -[SP800-108-Feedback(SHA-256)] -OutputLen = 64 -Secret = 93f698e842eed75394d629d957e2e89c6e741f810b623c8b901e38376d068e7b -Salt = 9f575d9059d3e0c0803f08112f8a806de3c3471912cdf42b095388b14b33508e53b89c18690e2057a1d167822e636de50be0018532c431f7f5e37f77139220d5e042599ebe266af5767ee18cd2c5c19a1f0f80 -Output = bd1476f43a4e315747cf5918e0ea5bc0d98769457477c3ab18b742def0e079a933b756365afb5541f253fee43c6fd788a44041038509e9eeb68f7d65ffbb5f95 - -OutputLen = 64 -Secret = 4d754e48d319e06c4322f27620b73d9760935c5ec12ab470c0017f959760dcae -Salt = 165878efcf059355f62dd76e70d7e0097b7308052650b353c692e081829199fafbafc55fc22ba555c3e0a0605c219d4bccf903128f67e2e71422596e54390e8057b4101b6e96db9f7c9e57ca9891f56981898d -Output = a778c15d24ccf86277aaad32a2624f3d9ee7f5cb6e76271190ccdd031ed5ad3b800d2f5023a6e327517706648bad25bb2583c9bdfce8ffbaab06f82f71b71692 - -OutputLen = 64 -Secret = f8aa0df08182be7474baa1849ee2d66d18325db62df95777157b6538e8dc7d1b -Salt = 97c5d2c824215390fccef733673520225438408031796aa134ec6c95bb6d3b05289cd35aa2496333e4b7fb60564df812f868ae426acd0afe298bbd0884a6d2c3bc3a034398c41d12e807b03de8ba4229cc7e14 -Output = 9ccd9df103d8da03810a2054c542b3e23462ca66b2f359e8c5da856be1973c27af4ae4c530aa8c65683dec1b0f952d901e23c736f600065fc0bc07a1bea8b3a5 - -OutputLen = 64 -Secret = 1f323de106f253e42d0856a13c06d995308c79385f333e9cd836e77ef8912e87 -Salt = 74bd11c6ea213daa84d186e4181884001a03d3b7f4b2c5ffa122087c2b3b8ebd9de80be444b6ba88f7b7d672521dcca249bfac4590c118da5d11614a51aacebefdd72c2d196463de0267ebfe05a11eb3ba88ac -Output = 8a9cbbb507d4895b95a80e7dc0e9ac74bfe437ae6db2e7cae1d99e724db4abc3a1e8315f607040c8ff56968b721f9ad44eaf622330a426c0f7b684902afd4dc4 - -OutputLen = 64 -Secret = cd99214b87956a1bf66fe781afd97ee47336f0efcdc2bb3628e00ca2d2022e70 -Salt = 398582d12693f52a835d4fd7c3e2d6db95cc1c8974c6f9aa3507051f18f048c7840d6997d3c3b2d592157d1ee34aa54ff9ba2cce5a9428be2dda8d3ffe26bc170e799b3d1b21b3eff2edd593bf07a47cb629c4 -Output = d1bbf08109b1fde34a496ecb1aede89a5c51bc7e32cab92a4cd2c3923e8b3a026eec8cd8f445b0957a2edc1fcd28a884bd4e5ddb867ae11430f27795fbba566b - -OutputLen = 64 -Secret = 2166b054e62333f9cc17cb822993f7351a0a64fa7d7cc117ba30aad02a4e519e -Salt = 5c148272c6450bee84f612822d0e87530617060d691e690201745de5362518ce5dad05dcaf4a28a7265fe752c5ac26eba865db9f54c45d1236cac8ce688e13b09575d9a94665df80846f75fe0b5c210e6be1ec -Output = e56d6934d19bebb5bccbc35c897f280910a815610a7b44baab6d9198bea8897abf530855eefe01dc5efc556ccc262ec96904d9001a1f281f9c64dee194e50cb4 - -OutputLen = 64 -Secret = d89d6cd2b5e76897f05d81daea68e335a24beb3867f8ed87b80419ba09b542fd -Salt = 088480022892fd431e2c4492c38489f59abeecb8042b1003da890edd32b3e37d64bdf2665fd4632de0c4f539f69a73b4ef27ef9b60cce2bf67a29de4434d8faf332c232c8b14ad6c1a39715f51a097214c4d42 -Output = a5ec935ec60aaf4b6431b5f4b4fdc1b613276e5c30eed2802e518bf06c831aac9c11eb8361481adf7b14da296913c7afaefa010430f7172ffad17683c935c0f8 - -OutputLen = 64 -Secret = bf96faf3f9aae74075636b2b5af7755a9326134efb481b661e15addbabaac472 -Salt = 5daa7d6d796f1de1fc6e900e2240f651d616a767e254dfc32710aefd5b93e873d1e71ac6685c6423b981d13ac7a707edbc55c883ce07370bafe220769dbdd5f76f16332322355705b215126e119f8d04d8db92 -Output = c2d1e27eda670489a526cd143bb8dfbe6c5ad88a4b438f70bd0cf2aa3f6014cb121e6d52db438f2029cad03e2d76bed02fa2f50eaa345f46c7be9be7a9826ec8 - -OutputLen = 64 -Secret = 69a123d514c9d1a7872e69e2dc6fd86d9eb580669273b74195390dd10130a1f0 -Salt = 3fd7c7a4f282e119a99778541b36acf9508c525db526cff8851a52f8127886bc825398fe2bc9b84d484fec5854d9036c8172917abea130fd2e304ef2983d8bc36467a084df60442f7645af078713788ed5fe94 -Output = 88ac0de1bfbfb914a0c51b59dfe19ebc43a5383353351c7d947328c5d435979f40d41f63ec517416b552c2bbc0a3aef1100fbea23e0209d02d179524652eb2bc - -OutputLen = 64 -Secret = a06fdb1b81700ca79a6085e612b583f74ee6a7a42ac5983564d36c6825b4ee4c -Salt = b831e46f83d5cb2be25b1dbd6856840ec70396108eaa344fe16c5d68b4814127e5a1ee85824a7de1a8ea4980a26503883ddc5636e0c6db92c4f32bc858d7465c6ff836c5e7979b46de1a509e60bdaa248e6f54 -Output = 9e69d90f022cb660de14f0112e5ff26cf8e304a6284431cbb088e17744d06c71e29c0afd3f77762ec6ae1fbac7fda7a8f800eba5e7a970ef1609391fbd156f65 - -OutputLen = 256 -Secret = a5eb2ebcb9cc7aa0ee9f38cdcc18956a041714369acbcb722d995010f2b8463d -Salt = 11be2ef7753959c3c070d49afce9c4d09ad8311a14e03bcf9edc2c11fe6950b48f71ffd48fe4680cb13582f5c977c99fd6c4aa8012378857989b52fbee90d358df1e58802db0a31f562d064a9c42cb44136ee9 -Output = 0aa2002a47da3d5f840bbb4fdc7fec52583a3d9734d8f69f76983803f10ec2872ad88baec5234e30f84022dcec260072a65047ad6ea7bb0646c71012b8684c0d7a0bd018ed4e23a289640a0d9c7c1885d310d933fd3fab5a20b1667da6e403a23909fac35bc1e80b7b82de2ed8b105a1a34a9754a954f95353d7c2f00a6beefed72ab38a7b638304c1b712027cd16d3dc9735db2fcb2f05712b490080c0feb94827bda60f0f47eb449eafb85380187e6df31c2f0660027f086ea5b5965e4d705ae7db9959a8e87acdcde604039a0fbfa72274b8339cdb3d53f432229125d20f3800db4351b4754742b2d6426a8e24076f349c589409feb45ff65738fd3d77168 - -OutputLen = 256 -Secret = 6c2f1b548ba2b031b60ed3cae6675f644d2e008ed1408af365d193cf1766d475 -Salt = 8ae9d4c573771b0885e7e3bd83e52607869960e83dbe1be301ffb2690c709b80462a8f77f36e22e10bb5442d0235fb27cd94bc83e9cca4d8ab1dda28582b8601d9273457fd4bdf3eeb4400f3b7823b922bac84 -Output = f9814201cfbcf39cdce85a58d7f223d08c843565ae1f39cbd96b13423297ee7694387ac7ef3ddaacb3302007cb671140fc9ea9209950ab3f34b6d1261d377050c847e7353012630c10e0726432016eef3c58ccc879369c8956ae955e41b7476768e114a0ba5e96a63bad2d8b57c880462df7ed0e1fb81e624d2fe539665532ec25c17895be3a766709b12f21bad8a6c3f1dc304ba34b266f9f5cbd6e9d51b2bd6d776d0a41d4900a185ef58fab0b9a1fde48aa2f17210f48877133ef24c54ad1e821927c65a28c7670050efd06b518eaa129ceead6e966e2d47c5cc00a325cfcbaffc1090e3bfb291a46a96dbb0a83c2e35ea3b476479cdb2d6a6fcfbdebd85e - -OutputLen = 256 -Secret = fa535783fcb15f8255807989afe445338054174e2775ebfc395c7ac258b015bd -Salt = 53efeae5e8486f59291c519c7071a7cb35e26b9bf929fe2b159b89bf057d0eec24b3c3793fda1dbd5dd5f94e825c5ba80779f896ffc5681d65760a68bae2412e7eeb9f08341f2d1583250b4c90135158e26f6f -Output = e17ab17e4a149f78a999f048476270cb06239dfc76add01def32d7d6c7599b4f907a1483d9bf2543440f1c131d4ad736122e53017d3b25301c414d16b11cf2650c1cec0ab1fa10523c4164bc9ddcb1d9390a0308682ee28f2c05a720d03e3d0a17247fcbeddb49acf66488d9fee360045bd5d7c3c391553d22fa1efe46e58de03c1c581060a6abf976e90f99b3e8cd44d181d867442474ee9f8d14cad3c6dadfaee81cbc947184a7c81734df0596a0f7e9569dc164ff1ac428159eef6937e96fa7e0f936e2b31580f297295890fa7f25e3c91a193441c274a9c47f28d5c5676cf2763c16baa1eb87174bf725907163bdffbb92db95741c47826df40ff01b1011 - -OutputLen = 256 -Secret = a4497df535a863753b4928ce1dc8d8fa083b670213f377525d105c6b4ea89561 -Salt = 4a6ecf3802e1e0cdaf56ffb6d9b5b1b7eceb21a68f027a93e610235e8c50856460b2faea56d8eb384fdb31c1e816c1f6f8981da36ea463788e50ade39b17acdbb0559e1e6582300188066b1600bb727fc4d1ac -Output = 2e53c67053e07a2ef354a3e804f14170bd68a5583021ee278f43721fdf4cb8588718f5c1a60e15f4b23bdf70a170b6a1023b0a0d48b4665f4a4d524a075bc78fe4def51942c7357ac90ff5daa44aee0d6dd6398c0b1cbe2eaa8bed29266858ac0a80ac1435fc3d90c2da1c58c9814e772f9a7a08bef00187ce2cc16ea0c15738db193a4cf9c4ded80a7ef290bfe69234c9715d39cdacd3ad0457cc4e653cfad370db7c035bd61cfaddf2d927bf31238f78f4614f130931ad3e04f77294679bd62d9793df31c77dea1eed26c9870234d76c1711bf3788004abf1b0b0a10ac26b86a0df26fca75e66962b5c34648611e1878ff17d56e59f8d537bd8707eeb12e57 - -OutputLen = 256 -Secret = a2017ce55ff5f6a05ca18dce7792250281a733ee2bcc4d0b8bc9b1f3386f9f6d -Salt = 2a6d2c1d942971fdc9c7569274aec8b9313bbd124631a3bc5de59622e7f5dfe1c8a99eb6172c65d394783e507fecc5a142614a0350edb82f48c8634475944fd95fec70cf31dacd0a134babc13353de5d9369e5 -Output = 583bca1db3a65e3130df90edd75e3e9293ac42eca5039f1e5ec5ee13cf4d726b0295e7985d3db67329e721fb61b64eed3992ad23a99fd145515a405561c50f41834bc0d120f31bb3863a3f33a2ef7571b16024248e2e0b4c0150af4c4afe92d9ba3d9422f33ac49f6cde5a88eed1c8f119071868da0792bd201a299c2b9353cacaf5c04a8e27bc9e78772896c2beb45e7760f0e84d8dab4965db398e32ccbf021323900eb0af0f9c409df209d0b9f4984866762be4b98691cf7da0037a5ae68e806f8c40ef8a38a77185446c2fb9a7f7bb8465e81f0aa57d208dbff8c16d24740f7290712d1c6355aa122a2b03b0003e6f4ff132a4615305545c91c55f9f0976 - -OutputLen = 256 -Secret = ec85b37c04b2b6f7dd46653b8834bf227fea9139ee8fb4c71ee6215fda785a30 -Salt = aeaf5fea18faa0f20ef5999edbf5b732bc5fa06764c5b8f2dc5e9c65327ff0f151273077279b32f0b66ecbc8cb5cc7712962b832d2a12a2c325b42c9cd45cc634866bf6c1f79d7c7b5f5eeea09d95af0fa76a2 -Output = 60852b01b5635789391b06f756e84956c18a17726cbf5f97b05b6d4eb41fb3373a10c90bb3feb04ecb2285e57686152b31f09ab3c558d295315ca98fca0ee1d7eec426564b70b5fde16960f8fbe9b5722148c5764c5fe09ea1faccc5c5c3c16841298b8a3cfdb3c8ff61aab663e4570eace6e8bbecdaafcea675b0a55bb291b6e730a3c39ec2e65a1d1112180f297f709b55e0722b6b649c6c69dc4e7ec556ae59b352744c79789af17388511ff0caf948ef3e80fb09bfbbc89413c5a21cf7222c4e4a8c4d239cc4cc15bf41d67ec84da8fae0d71316cb9a21de95b976b16684746a57ee429e174b6ceac5c228f66c7f7b7ed1cee1d3dc8d00ddaf71c7a02887 - -OutputLen = 256 -Secret = 9e4c2dfd4911432e0932784a2b291bbdf7a2f449f8c856a219d242efc3b1164c -Salt = 6bd9c6ddbd8fabce82f4ab6c965cdead26614de17abb7ac5c9e377e4960ae3707bfac53a364dfa71eecde11dbd95b1b08391c9a17dc062eb6373e314be81f2082397b8c34e34992cd9032d633a84f111bc8140 -Output = aa9e537072d26ded9c3a46293db4962a67609bf25ca6c7e3d59c3813cca968a00320053440e0494c3de81a4b4c3f4de22aabc8e85627c574f98178bde51c1a9aa5022217d864daae51681c21e5f77558e64381f418a4ad1620220642f0c88ee1704756a1d61b6fb40eaa8c7284ffcdfd31af3242139d53abe87e3ad6a4b7ecd5704dd8d3a089a756825ce5acc7ddc6f78f12c4f60f9a683d0f486217137f55a4c1bcba1b5c91a75a6ad4d7cc48c33c124b42cd61035ecf84f070f065ac15c0032db5c1d41819c71f523e4cea52b3de08daabcc8f4fa12a6ec2b63d51ba55dd1ae00662cf28dbfffadbe47049a3e64ddf0223a137e632e67ead3d8bddf31638fe - -OutputLen = 256 -Secret = 7a722a823b867fc57661fa2448f2005fbf1c852ae9b59b12454f376f307a074d -Salt = 3d33e878c562e98a40acedb6a942a8c42a3adf7a5555a20b60285c94c6f185888d6f635bdc5b9e09be763cdf61d58386a29c153f6d0df9aa32dc6e01141c66b989949a5019a7020c3c53420b27f02ed83bebd7 -Output = b92a4081c3e5af017781f4db6fd8979c8ef4bfb18e5f12b9b69257072da086226a472cf7cf5640bd71e2a69cc49856c5954f3d562c1a1719c209d4be25d0d664478a993a24fdc8195a1772dffdde4818e9bd7efa40b550a7fec8c25b8b423663848b647da4cb163a0e78c949add7e7b982d26cbae4015a98626500a6d82c2b3aa62c7862283463a4965f4a47a45680eea15357165fbf32322af983fb5dd5910dc7186824eb822c1f6c59ae25c6599ff9acdd7ad2d46141d83b7a8b1c3af6b1f669030c33fa6393017d4361c074a3d40fc904c8b8d463100004e3d752a63e19ad891b2b444c925731ae0e7fcb8f0708d86d2636525bf8930bf25903b1bf8d37f0 - -OutputLen = 256 -Secret = f90ebd0ac0383b51225d1f30d7348cdac677be4ed23720c23061382d0e60ac57 -Salt = 84795a690a91b81c069b47a6d67753518935a548efc8e9f57dfddcf254676ab4c29f79f7853639163ab7008062eee10a3ff91ff92af0db1599e2afdd7ac983e685af7fbd33d98d6a9589d21b9a051a5cfa8e5d -Output = 18191d87ea05b4a566c8a990c9a15435879b0b69a88f5c1c4ec482b1cd3c5cd60297d7fa1a8de11fbf9b4d0d31c950418cf3ef3a28d619ca4ee61339f4dee5b8fb6cb82215c5800133e46cfd56d39f8fb37ecaabba84bee555b2c1a687904590fa7a62cf68738989559ee5f2e646452a3c5e72a01fe5a29d912df19d0c3ad04acd32be5362e373d65873188d6bf17394f8780c889b8c3325de8e54b64914b7847cd81ba78d2c363b298a8bb05b0268cfa29304b3b3e2e001f4cb56c4c71ac277a6d2b12b01f1dcb908ac29343ba8f19fbaf0c759f13d13c51cc9865955a99b85ff6a611f5889f6ce3dda07281f342f294a4d40599c862bc2772f5391a05da07a - -OutputLen = 256 -Secret = 03c53c0a70f6960d28a5017086e395d7eea41c610993297126f9d47588923299 -Salt = c3bccd7835c878f3f21b687b9730b321cfa1c70c5450b70eec191742e7ffc409b631c2772238490b533b602be70f606b9d23e4e3aa4b602739441705e4483579f41c676544c0a3f39ce817b6b71f5f8de95599 -Output = 598d5b0c649801f66efa9a0e8b75d0080af5807bb539fdb29170b3d277dd3349e95cc320c156f8aacdc2ac535a81d5a0d3b9b7558af9e335e42ab85cec20d11a6eb42ca3167144c599b3cc772ce07269c08bd424bc370ffdf465ef6a51ba0bcfb0d03b9e74f0c86a932308b063543999b784cc6cc7bf2eeb28b219d20d6c069e76c6f55d21772927676b511ffe64908d30e51a9e09ee40cbee4e91c4c37d0b66eaa197732983eae89b1594b8d6eec34913d1145e4c243efa740a44a1ae6522e0651ea55491633c3dd8cdacaf4e57c03d960b5a5f0e1caf19e8dda1557a8a85a963a03eb91651a4761ca55ccd91d461469b0265969915442cbc4ab8f6623eccf9 - -OutputLen = 70 -Secret = 1b54526bf504d073b8b798971d4c207914db5ad7569accd1853b126e62d75f24 -Salt = f6eae7a058a3aabdcd8f6463795c1fb13bc597c3d6573da94be24dda65f309174a22baf5a7cfe6fb8c372f370e824d2a3357ebf0cfd0b1a2dc66c302b6b78a6aee46a4a62f27f8827551a3a4072d6296950de6 -Output = bf932ec004d422ffcf9cad3658c319d212e53fc576f731ba4c31b7c10b5d893c525ed655c08240b7d1ff62cbb91e24c541238746e63aa514a61ecde2b084c4e695b7ffed1ed0 - -OutputLen = 70 -Secret = 480132834be4b6b8e2d275f8b22c889c480eb4a0e45c9ddc0db491aad07c1663 -Salt = 763b79aa877d9c9bae771d357e38e88edbc1c961ccdd5c1aaf5635cf6136ba386b91ad4109ba96d3d4cce08abe803c4879fd32bc4fdbbd60e0203bd506cdbcdd63da38d5b3da5579c47622b74d8b9900aa2c15 -Output = 0a602e086f5c975c972af2670ccb44a557f732350e8ca38f34fefa047adf1922d8054b4404daf684c6a5bb1745abae8e6ab823df03c7c631ab0d2021ff0c9c8f0b1dc060bb5f - -OutputLen = 70 -Secret = 96694495ac18aa25890eb8d4007bce2f45d5a339d07c1816e30a8bc5110f3e84 -Salt = dfe1af7526dc77a70d04948e7b24ddafee90ece9da5949c2c1f6fd8b82864b932ee72a7e411e70f65b94c332f18451f2fdbbafaf6e09a41622f03accbba78dc3c6488e86ad5d9d8152cebaea110433686b08e2 -Output = d45582c8331bf6ef7aed5120fa29a323035be50bf728c5db8c195280ec874f8fefd6311bf9ffcb5ea32155872438af7c53b9c2a54ba96593b581926b21ce0fe7e1b2168e0678 - -OutputLen = 70 -Secret = 7513bb220bfc2519cc1d626565c57961238ac4fdef63ffdbe14ed41e6b7ec87a -Salt = cff8bf3ef61a1ef26a648f1af0cbb352dcedf0f30bbb994d0f813a3eb61409462a0b6d79267d4b56c8f69227de2be8d2058cb4b90dddf291df514bb4a0ce679515e5247248cb4cea6e53ca107ae39199735a1e -Output = cedba1d8ea6321f105057b5970040870f40d4564766341546a903293f1ffda06fbe3ac0b54085db7a65806e73399d641792dd7154ea2e54f482b29cd6a2e63c6347545b3965e - -OutputLen = 70 -Secret = 841c0ca3e4d8dac90f2b11435dfeec5caeec6273a8a9b119f4d9cc126fd157f0 -Salt = 919f77a64589a1becfd87c0b14344e94ff11094aaae1a32757369f548024ba97058c9bf0c07bf04a17e63f3d50ee3db63690c87cb304e2149d06d599552e838689d0e200959d76478a1169e769d40490d31f61 -Output = f2cf8f789b565267e57156aff32b542cbcf6bc989b9ebc28ef243e7449d70cf3afd95269c41060fb9b30baddaf80436e3127cca9a6ed136bebb59048234d72b6ad167e6532d0 - -OutputLen = 70 -Secret = 40d30e4d2fd23b0bf741697e0bf65b8103ec0af492f6a6d9649d320119555476 -Salt = 7a07faaa306233a60065adfc76ecb972af0eab1eb69020245aeca3294220652c5fcb1e303df104c532b2684605a01610fa5b6be910c287881dc915bb96e2b26f3de952cbf40024382592f2bdb0fb8c6e93e9de -Output = e64261d6ab0f827e1bc4bf05046605d47f1ebb42ce8d8ee173a1c4a9b35ddd98b2956d7d825d0f530f79c7d8b42f60621160c45bd20ca843d8a7b9a5a79dac00dd345f7f329e - -OutputLen = 70 -Secret = c182a728b0d0d05d177bfa6d9e3860626c77136bfbabda87768fbeb4f81c5156 -Salt = 4110de7776cbb2f0405993793cb872a1eebef40ddd23c8734ee48b5e6ef985fb217711873f24abd157c3484d7e07cf232afb532dda1208762e5025c9262a4cf8ebecf57afb0e5d0828d931e52965fc36e26b49 -Output = 4dc9abe5bbafaf881b0b3c3bb1d0693fddf9facd95703561805f62b992d4ae09f0049fc14b02bbfdb8c361a46908a9386f4619bf3e518a3d4cf4a99f0e0017412e58761023be - -OutputLen = 70 -Secret = d09be3f6e85a58c5e310ab069bbf316edb5b16a244bc0b8e7840e4ed18276fe1 -Salt = a87d451b450a5c9c4f157a2c0710f17081a5d85f9c2c70c66c9eeb320f666ad1b4c5235e9bd8aa5ca75bdeaf9423b0be53a9ccc92c078d27424ef1b3ac006e1e5e7291ce535ea2c4095e0898bb03b55482233c -Output = c0fb5de061f83bbae88e6ce27412a2e7aa6a3f587d655628f77676cc41c074a890c0d31605e89c52f43ff3f924a445f1be8a2b35e964de0f4bad10a724e3ce74f53c1a99d8b7 - -OutputLen = 70 -Secret = 833ab78dc0a2700c2ed8775c1565583895ab58760206675f25829f883dedaf6b -Salt = 14aef75054bf33d2e7417535fd8d9f8a872a8121d91eb5bf15f2799d2b5c7701645fe69ba5377ec8d54cb2a774bf45bd008f7ac491e818f1835dc7b03b2df5a1812cc76d24185e5a962be381dd2ed3f48cf30d -Output = f0025aa175fc9b880abf4f4ee741c6d11d88286f43d2fa8ea4e96b55b075227c1c84a5797da8431fd8811274c7071627c3fae554bd0d4cce9074e98f5ecfa51ba67704efcc24 - -OutputLen = 70 -Secret = ad4599bc0b9eddf5d296ead77854cc5860c8992040ba967cea35d2ce6c59ed26 -Salt = 3f54fd5b8e6070018801b4b5c030b32fcdb7f92e62504998823c1289b1daac4a5eda6715fa3bec5ef346673c80d940127248680ae2d37b26ddf7845431a741d9e00a75dfee5ec3b662f2ca3df2cb471faedb22 -Output = 8a1a108ecd32ff4a7b73682e9834b54a49aa75adab215a7a7bc80af1596c0e9c5e097490aced7afddf2681a28496e12204fea486757d9ed5aa18544de54d55fa3e7430f85e31 - -OutputLen = 300 -Secret = 3eb9043a57cbcd10e7ad9678688d7cab409de85b79d913514b39477d288fcb35 -Salt = 9a278a2898b8c805714f5c9256f4f68c6ca590ee84b9dd33f6c84d2c5928a40485e356251bf63a51367a057cfe12534f0c973c60f0d8c452b6f21a2eb70526ad31b996022842811ea4a2c3bbd02cfe55f9ef4d -Output = d901beab2299a0a7eb66fe8a21f0016ccd5705139e2c8128824833d10f504fa98f6240448e0eb3be45bbbce48138ecd4df7470a12bfd3d4507c76448f9a02fefed4e03d585ad3ff550b053b7223f6e4c6dd31d1722c5538092c4b5da46938f28d67311b66848c8c1f5dc6e6d28bfcffd11ad9c7255c831ce6aa55fe0d7df463589cb444072511f291539e740b68ea0f4feec7245d710bc290f08c8662bb85a34c6df7ce726568b702a038ae2033016832a0d942d50c209b7434fa01fcba4b65e3a58c9c545d9540d6c0a0451f6cdba82c8e33b716f2d09c7b3756cd4c0f5b361284d995ef135a5ae755095489e27bad2b758dcb3705755f1141325abd9224b2a1b354169fb481b836603c5f8e7bea37e21b6c770ee85a49a9abbf15fb1d48288a22295ae99c875b11d284915 - -OutputLen = 300 -Secret = 0d2ab5705bd897efb1965f4e27378f15c1d9599ed165edaa4500482aeddfb55b -Salt = a9cab8d023060f7d633eda56f96ffd2dfa9c4dbecf6efed803eab0a96239ea21de1f46e446371fc5a73abd5a6280aed75ca79fc99b7a23e37b40bf8a214dfea856d87c525626325a70e8c1c4f4a8daa4f41684 -Output = 305e82f387cc310157fbbd557c53a965e3fa112a54bdd767f663677ffd44da42c43bc0100ac4a91746f651b01cbe2de193b9e64abbcb9bc9a66cf8b3fbd04f3de2ca7bebf3ba7d6a65d048a11fab1c5b93f1ac0766154ce16492cd4f9d90706e8ae5023b33bf2d6e3ea67859eaf506e6b8f0ef6dc9afb6a264df73d2109564398cf3ce55b0e2edace4d96dc609a9cc6c3b239d88d90e9224ab33c9b7552969c5dc749e8d7efca5b61c6ea137b1e9fc71007953f4ffdbcf0e64eee539f34efc958bad37d7078fd58b196989aba6c226706620f3c1c891bc07b888e33c6e84af75d65417120bcb8a76b5cba851aa54a43d39c7ff87764a2842402a3c35c04d8c12db4444b95bd22845087903b8f50f1fa77690a6563762ef0989cdba220825b694c2bbefc54f2b43a5d31f6e51 - -OutputLen = 300 -Secret = 2a68ff3ae63446306f48807aa1b746e8c886805f9dad8ad14886bd79efaf4f22 -Salt = 3ae02fe1bd0bcc74212172ff99a938e1ce64f825d2d20a19e71005bc147e1eb6f163599ceadfb7c99b3f1733fc0a7e22f342c36767a8e8c8c075093c5a81317ae921f85b932cf743bb35f367d26bc6af273df8 -Output = bd9ebc6747e930d89fd1c9044405029fc8062ea48a2197ab24de7738007f6cdf82ea3727bb64de71ed443078a25fb1d4c8af3800f160abdfa77d9b695ad2f488f0deed3c902fecdc403a4ce0db1a924bad13b6c5a4c4c842ede97cfccbd933a845c96d85ad091fe6e8343dca742542bdc79aae5c0c58414f0876ba46261cb402fbe4f07d16e81c74eafeaf7a020099376e3e40f41704825bc395db62494a10762b23908f15a7f3a7a35637437e9eedd16c2d0c18b71007d14fa167eeda00b3728bb16d731c9f189caea01f9ea87845a35ad5f671c1303a4677d8c09c3ed197fbfa3fc91897b23b4c7c869f1d89aab31a51ff6db2d56039cf164c018599978382e5ceb6cd63fa61adad36ba0c79c294e4ac15e467493504d1a01c4bf1fb043523a06a91a5a2ea433151deb413 - -OutputLen = 300 -Secret = 62ba71fbd7d1854d8b6e4b7a472bc94e3ee56645424e4107033ec9051f289e17 -Salt = 17f94453ef4ca84a4dac07bb02b839b18b1b275ff5fd4bb18be8f646dad82038c1ee79a93f8b2a19999d4140f4df6d368e190bc8752f6e283be616d5bf44e2bf9a77c6cffdb4be08cadf6f1ea6f92eb6a6c44d -Output = 874c3ab1d27ae86b846fd2d6848c60561f2ef152793e4e4148c0cef23f59acd9fa4587d6829c3f944de777bd2b1062c693faf3eb7f99dae6214fb010b7edeb96448a8e67d44ed9becc46815b6488947780ae81f41ee873d49af61cfca54d2b3bbadacd84d642ebd59c574fb6d8d8090c2d6d0317d7366b7fa6c2370bd9b7dc03dd363a6c3522dffcd8f9dc5945bba1a27a41d126892aadcfab8f28a3086228b48eb6934ea21378358befc50f3061bde2c2dd4c2dd10c4a22c777ad9a012744af3b700e98a2c9d467a58b7eabf66add1efee4b9d2a6dd8dd58bbc06dfb98a27d3191160162141056173d219eab09793d42748a42f48a6da6480fb39dbc2975d99134e94bfe8d8dd16a51d8d9166b3d70bf9e55d8774aa020e1b6356351efe953ab130d4fc71ea51400992a8e2 - -OutputLen = 300 -Secret = 5fb5fc777839c35eb10e24776efc579384f9d6da352fe686995dd83eeffe0252 -Salt = 4ef6d47ed944dd7b370d817d3fdb8d03708335f461bf6fd1a4af0853c9e767b5b6a91dd52bc999917e9d2dd124f38746fdc6a83d8da6bd8db8cbd2b29fe30f375b139d8024e2c387747b23dfb99e9b766464be -Output = ea4711d67944a7829d47d50fac6718cb4956936a25e9a8a28e1e8f952204054b4080a81e0dec7ff87bf229ff966a172ea374a68942761253b2a035cc4c33a02f4247d4606ddb2be93d6af19cae9f190c1fd65ac62c7980e3b1ae36972dfd4d69b72fe06d35f494f3e40775a4387ac2c93413209fdba0ae49b0753335185a70073d1d81e84309c2cad17ccef60f8d5f56b1ac694736f9720d46c9d972291b4f1b17a299a234f8011b33b99c08df2ff78038c54d16d6e9cae90ed26255d007205fb46ac9eef69dc786b66aba7b4db98dba68177529566639dfd425d598a65894eb38ca42593761e959e03c8235d9bc9e138624d9da387a6a564cbba5cd42d991f1cb4a0a75a0ca2788a0528bc084d62b4c9fe44e954370c086522aeb049c2bd4b162a7ec1c05c13b41b9887ea1 - -OutputLen = 300 -Secret = 68456211b0508abccea48ae128df21700f81cfa4aaac8164ec63c2482bdc0e50 -Salt = 6994b87ef7db9692f5b64b7b4883297e1bf68be79afac04ba8b27626979e5623974e985a36f16bcd7687178cff01c8314f182f9e5d95ea094fb964056d989cf8e13c94ab9efbe8ed0634bd9ca480060ecd05d4 -Output = f55755536d9703b767abdf4dd09795434d83fc03f0befa93457ba3e5d22bc90e62f033126357f6c2cae707a741e66520c74e03801920ddd2b95236082fb0872d19badd44ed2aa4048546a2202071c47f94aee9d555e7f77950b167f8e7622ece447ef09378def636e697f2bdea8c3ef2ad7329eb2cf604f3739de476334e0766e4fa03ce4f5451b70c150942f49b7180f8c5bfbe3ded42c5da93fe96cb84eedd0755ddec7d08b4bacef19dd3261557d2a3debc4ab90c42db8b567f60ece88fe408c4ded1b1e927b92ab274409288ede22207ec1f969b04ac654307959a48ea4430d28c847f339ee9257b458db129cc132b035354be60c1d1c5a1386ba014f6ac5a42d480affe4f4e1047e7cdb47cad54c0d7a0b3affe9338096ce3216d826460b6efbf6594972fd93a4a42fe - -OutputLen = 300 -Secret = 3b512e3f0bc6aa576fe0901891ec95a68708d5eb92d67e5f32fa7ad886e113ee -Salt = 866d2384da09916e72dee00c10d49f21309fb47b5122488c37ffb2e644f5ac68059865921152e6107381a937327a2eef9949da7a02fb6c95c323f6147a7ac157d5df0162fc6f9968686fe90446cf6226875524 -Output = 3c217db54fd145102a8889476af144b3d319e623a28ee5a3fa7dd38c1cc7e4a163da1bc8b0bbc2b0ec31fc55637a9ea5db72f3921e9ebafcf647a88c304c6e8abd522c7ffbbfe841f2f85208304cbad680bd407c9fe13c4f396eb831774bcffc801a88786df9ce22d3d92c21077d45fe1b35c9e6caabbfa05d6379bcb8f032a191f1be5c27ae1fcc325269800f8ae24ecf9a67abff910751e11c6643670a533547b010de45c16878da5e4e0cf75cd66bfb8c7206b4d5a6f45e7f6d8d162104328bf93e3f460a16d2f66e353f01a4256c797b795d740f29af0c0b00c5919f6be106c4a81c8f45544dbd06b6e12ea731c6683d2d35eb96fb36bff41fb6f0d58a6d68f7a55729039d41edd13f3f9af5c1c39628aff4753d3d5ff729355fe574cee7f66667578df4a87b96bcf2d0 - -OutputLen = 300 -Secret = 7f5b74e83a7de0959fad68af066786c07b77a4a3bd2ac9f13db6fba7b48e8b96 -Salt = 5003831ffdb2c0af99a64cdbfca91f6820ee55866dd5aa350bd0d16aac3ec7fb603746b49b2117206fae062f208e6fda2636c3131102cd7453563ecbd401a2b3c896796bcaa73684b85a6013b631beed6af585 -Output = 6803c83c3d1a54273a651ee2ad9557d226b7ad6cb217098876b2bc0a27ef851e190fb6f66f8cb6fadc68534c42f707caa898f4b6f8b233c5c0d2ab02dce72f7732ae704787cb9a54d4f43ea9f24d32e4fc3a571ee37a5ae8842c0536097453b54fdc210094704ecffec5d917dabb27f48d4963ac574e2ce20c4e8cc977217d6380ccc182a9f8f26337a78f8ac2e9fd16e5d01c842c181fe62ebdc47576ec5c7b21af50b1047b0c137a6ed946ec48666c7887aaf0b63f589c92ac37a8e8b317581bedf9842353df67c3e908d0a8e2b08be6b246f8566f7ac91c72d893692ecfa5cebd587d1d32b705765a26b868ed7d0ba452a3900a2d31406d8d02ad0c45f57898c5f5317d59b4d760af6dfb1def3bb7411aa77fa782025fa6baccc5ba91c87da2a11ef5ebe21fb9eaeea370 - -OutputLen = 300 -Secret = 37a4a8e14895fea4e53464594b4aa5f42359b06c5c55cb74ebfe519d205b8dba -Salt = 3c059efab9555232dfa881e0c437542ebe3fd31c4e1c9673d1c009c9fda10aad638edce577979e1b4fbff7d8599cd4a5898e936297be4b83018169613cb2db927b1c4c91693c1e20c5d0f84b213efd98921d94 -Output = c3b82651c033fe6f96ea6deef6eabe140f0faa9863557183c39701dd6cbe976a7af16f0f75544a2f20e3400a82e605cf294449be2a95b6fa7ff2623ff73dbaf547a6a5217b95d00a478911bd2af0e89066a788d2a68ebc37cd7cb71653778278f8326f881a2a5bb6d04986cb9b53359c95cabd596270c1ed75f6ff8597c518518dc0a0e935e7817e8a8e04fe5a7c2205e254c3c3ea562ea14556e4576c8da6c46c66d14582f00f713ecaeb203dc756e3c6f78489e862fbf4b0666b4c8745a6aad17be8d50f026ce06b4b32194ebbb1b50ee75b58f99b31c7195280b832acd1550adc382a4ad7122a77fe8e789912737a556269736a873e56b944f7d10f8f00b30b256bb1121a51f0ac96fcf562f2cd238afbb1bb0080ff28015614347d14dcf1ba575575c9da2679bc357d41 - -OutputLen = 300 -Secret = 380e1838b15ea3b4c113dcbed56387f11629ffe42eab5be2030134b65ec6b0fc -Salt = 7510c1e6cdcb8ecfcebd34dc8458fc93fe453fb600821282a2feac05835e38cd8bcae2aea8627c72c744d142ac78c9acaaaa40eb084db09c92bacf044e10ce85f112393f6e1d3f7fd2d564908e052c3bbf5559 -Output = 5fc2130a6be4b8e49baf8ec5de6ac9114dd4ef14e506c3a731c5ef6fcf807557974f4570668d7b64722b29d212f2c4cb9c45013a6b2cdded7abca932ebab2ad815684f3e8abb928c1da2c74c04d07f85356a09fb5fb9dcc6071881b6f47e524173ed417d2ea894f7e8e0fb5d67baf9976d728045dba93cfa085d7ade9053579b1c9570b50ecb721feca598655fea82dcd1850b2fc53fd2d0e8f36d165340812bc0458d349d457e3341833f496134ddbfa961302ddffb818a593dd51e365ea36d7a84dc5041d49b0ca2df6327946ad2849eaf458e024a45cc33733907f64aa84fe93fe9588fb124dcd3e80923ab2e6db16eb760a11575482fce8d9c60587897e0af51398d26c4a1c22ad53f54f2d13dc6ccfa0b574586f8e81f3eb0a64f21dea5dc8d8881efe35ec926820651 +[SP800-108-Feedback(CMAC(TripleDES))] +OutputLen = 2 +Salt = 32087ABE1B9A6743612DC521A3FE08F386FC +Secret = 75231DA5F474E080DF17D0F64D53390BD260340CBD40C882 +Label = 9B9A54C58AD89DAA234CFEAE +Output = A068 + +OutputLen = 2 +Salt = B02005C8C700BDC56C2B7BA8958DE957AA4F +Secret = E0564C1571EDF76A01C40B212CE8E5726BE05A7915E55C02 +Label = 9D2BD10DC8F89BD7598EAA2A +Output = 5BAA + +OutputLen = 2 +Salt = F5E5D7313E6EF6F159D1537031E2C7F39398 +Secret = 6B0A8A0A06E026B116842EC927B624F91CD4E5D6AC3670FB +Label = 9A0F0E129BF3DEAEAC91DA88 +Output = 6573 + +OutputLen = 4 +Salt = B3FAAA75C71576A66E60638E316A34A011C3788AB794DE521A64AC4C +Secret = 6964BCEA82C3BBE5442ECB68A8D8ED5BA2585E7A5B7944C7 +Label = AEBAE3BDB7EDE0E583FBE482 +Output = C56788EC + +OutputLen = 4 +Salt = E6E110E07E189830DE681691909125C162004FBC5EC5979FDAC96CDA +Secret = D686AE9A288CCA81CAF8828183165ABCCA32C779683AE4DC +Label = BA0E5A59DB9AFB880D3DBA47 +Output = 2C03A283 + +OutputLen = 4 +Salt = E6597435AD13A047EAA199282C80B4B3A015594BD2A5B9CDD88B1068 +Secret = 88D5FB0B307B138E0CF9CB6112601D785427076E77387212 +Label = 6C1078EB08EA9E63CF02EABC +Output = E2BE38A7 + +OutputLen = 6 +Salt = 53C78C92DF22AAFE2EF558B49E21A5E77E56C6634870092113EFDB7B9D2FBA391764BDB09AAC +Secret = 4165E36C20A919E2C55811D2A1E093167A4383B67D43D985 +Label = 42931CECC45A69597CB857EA +Output = 5B79FC90883C + +OutputLen = 6 +Salt = 99E4CF26D69032FBFC543F954ED2434B18975A1507D02521D79E504CE8C7F3B350E66DF43D24 +Secret = FFBDA48F150611BDF492DC41AC25E9132007739B183AF3F5 +Label = 2417E21CA65F6C7D4E7991B8 +Output = 6651AF5067F1 + +OutputLen = 6 +Salt = E5BEBCE6D665C5E45C2803C64BFC3661BD4D4362B520DC6681806D410FEEA34F40086FF1CB6D +Secret = 386122BFC094195EC3A2E5B4A8303494CDE1FAD1A9FAF5B5 +Label = 013092F136CE511BBE441EFF +Output = BD482C3323AC + +OutputLen = 8 +Salt = 4F43F8196A030983851C9BF0267D5D4448D2467D0D0C8232443DA0484358FF19EB1AED785414F5A1808BCA0C6B2745F6 +Secret = 7A44EB1A7F433338DA8A8BCF16644C20AD2CB46ACF54CC17 +Label = 210C9AE35D0EBB58E928D8C8 +Output = F6EEF5F2A21D717C + +OutputLen = 8 +Salt = 36C3E3DBD7EC824AE7D0036528625C714473FB142AD117541DFD742BEED836CC2F693E7C96210892CFC7B5B9C28AFB11 +Secret = 2552AEA8CD042A3CA348A6AAA64A591B8BD9E50884306B29 +Label = 8D36EA8A1018449D9E4EFF55 +Output = 53F32E20417156E4 + +OutputLen = 8 +Salt = 215C254D1BAD1710715C26C0F7A841E0E8BAA567708EAC34A5EFA0C75345AB9389304615F8A35E617F388E5BE3D95A49 +Secret = 3250E691989C49CB7692D9A074469986724D4A053E09288E +Label = 629C60D805BB52A139066DA7 +Output = 42D01A621CEF7A8E + +OutputLen = 10 +Salt = EC9030C4959D9212D17656CD24DB7FC0CE9198FCDC7B29E1ECD23447FF3DEDFDCFA4BE0F08A1FA15178AFFBA38B930282BC4F082A0A64DE13814 +Secret = C55D54663E291585AD5A6B25F9BDF001A31ED6FFB62D61B3 +Label = 168416699E2F23A9B29B0D6F +Output = 96BB89EB561B153B0377 + +OutputLen = 10 +Salt = FA826F1B319E8A17ABB4A87679D85BDE2FA99D73ACEF68B1161262285EF63130055430C76B6AF30C34782C9F5227B556CD6754F06292538FD774 +Secret = 9B55632283C203611A8882374A33A295D90C7D3AC8BC2FAB +Label = A288CAC2ADCDA9F6EB248A96 +Output = 1A36072319C420CB5900 + +OutputLen = 10 +Salt = A07C1693552B8ED9DD32C3448A31A266F05FD02E689C8B0F891D4B79583939B6222BC804B31BDEB7303DB5F20EC617615A1640D231E5EAE05D83 +Secret = 795E6770392AB16B95E7EF4D4316098AEF53C9DFDE5BDBDB +Label = 2C0DFA36F010981CD54F5CA3 +Output = 0EB538865D8EAA35BBC6 + +OutputLen = 12 +Salt = 6D378782A77717AB21458894A7E0A99C78F2432389FF1BAF963CE00D774FA1B6FFAFD065FA28E5B456659749D40F7C09C1ABA51190FEE768327FADACE22BCEAEBB38623E +Secret = F068F50F96ABD55D2ECE23B785E8AF3FDC3D612F765EB8ED +Label = CF5EF785C7CEF26B939CB504 +Output = 9BC79E4572197CB99A788E4A + +OutputLen = 12 +Salt = 653287700DAB16DA5B473BC55C53B1F3BF19482D156085852EDB0D20012165462C0491DC54E0AA41024423A19539A0FDE01C8280968C3340FD53B1034CA99A34661A56C3 +Secret = 0F5E9FB58FC49945FF30D0AB3FABE54381F8E685E35FA59E +Label = B3924476F4F8EA1E447B3F9C +Output = 22ABE2DAF85F56B3D6D2D074 + +OutputLen = 12 +Salt = 3F1C0A346ADA7DC39CDC1DE29885F990BB2BDF9C8932FE4C762130754516438298B47C91B2F637C9D31B1AA7CF2862C3866E186F5661AE6E22837D8188FAB3BC3665B9E6 +Secret = 084EC194A63BFFE4AB2196C7C72B1858ABCE1BC1325214F3 +Label = 42C0E618DDD27DD4AFDD3749 +Output = 8353951390E8971F8035CCBB + +OutputLen = 14 +Salt = 6B9907DB76CDB55B224DCBA80115652BE73095A06129B0705143242CF2674621D7068C616BF6B9B27EA932EFC0DE5822146418BF7BA83BA17A435F169D566B3B8512D84BA035C451955721FCB1F9 +Secret = 580D0BE71BC3D350948689159060B2C6ABF1AC8BC8DA1C27 +Label = F6096A799ED6CD183A8C86FA +Output = 8A3D56BFE5A11C93292356DFB5FA + +OutputLen = 14 +Salt = 2B968FE94A2CE34B73CBB9B2FD68EB75887B36EB32A8A4E1139DB9A874BD6E700110535D20DD62F2F6013FF748B3C296F2A8FE1417EF3BC9DBB81BD2DA700FA984BEBDBD990EE4B9E7844C4B6C5A +Secret = E894D1A6392A554FEA4A8B0E3BD4D189AAEBA367DCC197EA +Label = 1C33679739D98A8D327D237E +Output = 7DC0FBBC3DF685A4B53793A559CE + +OutputLen = 14 +Salt = 25561A2BCD0AA703AAC4A0F68A80C04BC54350DA65643A57EE10F59004F64238500423CA675EE514C79F6027D7E90F9CF15D400206805F1AF0D06D6E1997AB3429EB94611F94098F540E326128C2 +Secret = B998A06CB8A27231E85A9CBE65EF23396E1214D2351D8E22 +Label = EEF5F1379A9C84444AD48849 +Output = 70889E7612E3BB596B635EDD4F35 + +OutputLen = 16 +Salt = D08660AC8D652CE041D429F9F6A82CE6EFF1E4BC0C784E7980F9FCAC6EEDB766E3BA672DB68782AF8624C5ED4367EE6A5A3D7104B9B9AFBB36E369AD909DD9ED9F4F61781BC409DB6EF9DD83851DB98D265489143D484F94 +Secret = E335A70EB5735F9654D3420515CD8F507903EC60CBB78D0B +Label = 2457FAEECE1FE97DE614DF82 +Output = F7CB1CF7700CF2B0F93A112F5BE6B4C6 + +OutputLen = 16 +Salt = 2658CB560020649503068BC2CCAB31608D72F35440C6BD906224F79A91BF2254B009C1F0EADA46C7F1937BF310AF58222588008699134207CD29C8871C906D1950C4B164D7576E07DC0C5746B85F61DE827DB62FD280681B +Secret = 8D0FDE044FB7E3FAF853B49C306D9781870F3A2B4AD9A47B +Label = 44A7A3ACAC6A30E69DD7D913 +Output = BD4E5EFC31EAB6A37F5D4BAA61EEC222 + +OutputLen = 16 +Salt = 7D5C6580CBD64186074D3B6E137B9BD03F494D4A0EC6A20006D1EADBA663351BFCCEB3FEACC407E20CE3437183E9F3C28D9DF7FDF42955D66D54069EB660BA81B9CDD4682AF8D6C2B795BDA32825489A4538F4E3F273546F +Secret = F258189D12FA7306EB5FAD1A8CDF3D7AF1115CFB75E84096 +Label = BB65C9804E3CCEB2CF1AC503 +Output = 95922474EDDFB1E7497C871BA0B6B723 + +OutputLen = 18 +Salt = 7EF9167343E7F98256516DE4DAE69388DCE4BD03C8E38FE6E7E39402EF72E3A2DA62392ECD7373F9BBC1D79EF191A40D3909ACA29BD883FB551008256D33EFAA46532F21D600C066001657ADF7F0BFCF83FF19AA600CBA1A7A5E78EFCB5E0CA1AD63 +Secret = 665A8C9DC32FDE0B12F7F7794BFB742EBA06C6EFD10743DC +Label = A4A13828F0F3C411241B196F +Output = C4378ED35C49A9CC4739F77226C500EC26EE + +OutputLen = 18 +Salt = 26C544C34F4CB6C59812C4C1C92B2321681EDEB3215E1DA3297DD13A0AD55D6B77C0849D6480C61043168C24CDAE287F04C1043E6E3CDAAF004FB5EF73068B99ED4DD58D271BAED55DF6CBA1B4B5FD8FB5838C9BCC1F84BF4B7770770677601CEDF7 +Secret = 4FBDE9A33163FB529ED7F9FC4791DDEBFBA2F34719C8F327 +Label = 6549F486CC5017B5283616E9 +Output = C06352AAFC59C3942D7A0644DDB23A215F17 + +OutputLen = 18 +Salt = A54940F649869F315EFBBF5DC44DD6C07CB88507757C9C8C33D6E4E4A0B76699156899B28A58EF5ABD16CB091893F4F47F5807B7435685F5DAD54D8F2F72BE1C256429A1F1C66B055387FA65BDD49973CC3C52F6EA32346F3512A32F3F980A404ADF +Secret = CAD90AB55C832EF7AD62979C6B33A978D4A407DBE6D16327 +Label = 43EBA3FE5E92477F6367F7CB +Output = 7199112B6ABF2BFA307D8035895A93E3874C + +OutputLen = 20 +Salt = D39816670ACF393B86FCEE4958A84A7CF6626DC253C9F09831048E70EFCFCEAC3F04858788FB5C4F584109565D0352C689C3D1C8E41ED8CC86C2DA759BEEB3A5411807B50C181EF78FAC4579B135EC7BB8BA6CA5061B49A27E63340F6F8E58D4A95BFB913247573506C1C650 +Secret = 5CEED31D85E5C6B094BBAF582C1C95CA6DA6F5B8B6FA4A4C +Label = 466E9FBBBCB27AC81DBF3EC6 +Output = 43FC5CC0093944A7D709320D3FC6711F36D5B0F0 + +OutputLen = 20 +Salt = D74BC28C5893835FF9FF76F360CE55BE83C064735F11AA6D349CF9655ED4EDFF91D66ACB3C78363D18D7F03CE2A320BC6077626AC192671BA58DF112CDCC0A606495496017F2C9F37F7D2B3E5DFE6719C9207208E86E1A16CB63C22B9F3E967C5A18441E5C4E37BA5842DFE3 +Secret = 98DD59ECCC93F43C812E7A1343A8E439C31C60064B2E5BF1 +Label = D57219A8C5A18FFBB596E4E0 +Output = D0EB698A515B5578B6EC0D43393BA6E33E2001F8 + +OutputLen = 20 +Salt = 1C29846E98543F350B9C519E404A67F1E6540F96440F518EBFDC576FD7C0876A1EEA813AA91D3E1DA6C33C9E242C009CD43AC83227B1B41B0E1904CBCF4105020AD737674D7242281465065C296DA38BF868866F28E8FB354B460C47D463F3B88910ED62A114CF7E3EF6EE81 +Secret = 8E219F8FBDDF5D95BCDD7C3D4831B2A41FAFB304B7E262A4 +Label = 6CD15FDBD4A346D581C90488 +Output = 370A47F02A08BFA937172031A2CE4C16689013B1 -[SP800-108-Feedback(SHA-384)] -OutputLen = 64 -Secret = 5308209ef20720b05bef31c5aae8ac89e1f77548fffe8a24f783f40d86d2a89582036323f91ead33064f23aa2e959d28 -Salt = fa9e3ad0fe64920c7bec3baac08cc3fa240509cae59f4c488630ee8b602d55fa1475f62404800249e715c4d4e9471ce02b706076432a189e3ce37a923ca63ad3cd6e08702512cb7f79b113a0524f1892c54e88cbcebf73dcc66ba962c6683332d2923f -Output = c8896a304576df5f5dfbc2f8cb0e1f33f25fdfb389138a812788ee035350a5018e75b5039323af2bb528a7a39290cfc9d611e9b0100a2234e113cc7d8ce02227 - -OutputLen = 64 -Secret = 7ba54880d0355b530cbd6fad7e7bbcba5fbe4e3fa653a5d70f5a74c2923c5da49139ce82d3a59a2bfa2a4c95b5a691b1 -Salt = c6bc40cb67fca5cea132a10616bbe7af016f382951a26454194d6933687e11613821ad47de919f8427706ed13f41de2d34ffffdc5b467db55feba67aefc7cfe862c2bcceb2b48246e08cf67c5a76c0985fff5e2be47be9d76b70a396e12171fe9e5b75 -Output = 2b83d6931e598e4c768cae41e39c43342b16b6305449748623994bdd3fd35fa56091291c9af69db0727ed11adb2eeac82a4891b08ac39a6ac43d3d05e975db55 - -OutputLen = 64 -Secret = b75ab2f5fef4f52de11538bb46d124f15fd3c21330e08e9d54378384b4af364ac4ba980ac377674b5ff77780d7326b33 -Salt = d864e99d2d135d2a0a4c5f5512bc587a20b5b220509aadd47b2beefb2d3b84632bb2cdd87a8be4b7e6d28dc9e0a9550df7fc9264041fa847ea83e7638c5795d09e369d0b92a5f0e3e8694bffde3ee2846fbac55cbeca88d2934afcadf99a57166cfe36 -Output = 1203e16d8eaa8616ee010bfed529560f35caf24783050d2aca99d200ed6acb7766f8cc2add93ea7ed2b21af21e844d7f3d5b81d57aeffb16bdbb21c88d8aa386 - -OutputLen = 64 -Secret = b366b2802120d076654886ab0a75050c023770da2143b0ea445e23c9214c8c741c83276bbfecfc1f7d9dfbc9ed217b33 -Salt = 395f17d4031dc186082a823a05407b1e8dfac6567580f75fb94202990ffa6d58c5856c71572e8453eb4d97a0e64a5fc99d06ccf670bea3063cff25ca865d9831e3bbe336166833af21ee8b1ba7ae025eb4c7c97142876aa65bf5f16d3411218eb89ea8 -Output = 9840689f563ced922cdff83d5bc2d2407db70622ca4b11ded5c5fd68353553cb3778ec6bdd40458a4c0b561476da339c124daee85875164a20d546650e216f99 - -OutputLen = 64 -Secret = 1194207ba703630fa777c27279feb2579a7e6a0633e1961771e3e40deebedee66052d638c0c54335b29e421a3caa5b89 -Salt = 065576631f05fbe05ccbf66f774c202e726fc738673a5e63446ccadee5b978454ae94e699f28611afbae434edbad83ce50c344bb4bb6bc60d44a364e4c5e4a1fae08ddb075592c00560ce0b7b84d105d97eba7ad46cb62bce2c64fd0388509bfd29789 -Output = dec256c036df4aeb6d840c6aaad9f8a8db0e6543e0572929a0f93a34dfb36755ccd8a68724d0f5c9637347e239e5b87752b70df7f6fb9fc2566e6b9b1e66ed61 - -OutputLen = 64 -Secret = 3a27aa0c87d90b08e2ea7187ce910705d2e767fea29b1b1686b959759d2f9bd46dcbce7fcbc15e5634155984c9ba545b -Salt = cc308b64646a2f7b27f6bad4d312128373451abe03f6ea768ff7b25c3df9452c1d76f9ffd22ece46d3d25bb4b890e79628e6a18e540090252bf6040bf286aff0eca120df99a49eaab26e4e9c29d05b16ac3fda983b9efa15bcd01b0638b46e20acc12d -Output = fced913e63927149cf1aeebf482457058f450c46272075c798a282ad50ba429d6ef8cc0120d0185d14789f3582dd71f2d0773f5363306060b4f6c66d4f86ecb9 - -OutputLen = 64 -Secret = 74181e59a675b824aad803361cd139426ac63089337efe86420ff51c1cb01044299c645b9dc18f0eed3fa2672a8cfb37 -Salt = 4d6f436573eb07a5447d31eca5eeee3a6b2dc5e8039bab3079da1ff5274b1a48ac4cb4eeac7866558188eeda755a5e4a3e5bd6542d8762027f9be51483bdb2b6da9f1adf695bbb5d85dcbdd6be62bdb34cdd9a2739e8d04303d6d7fcf631a4d1dfb4b7 -Output = 20af7719cd721b762f2127edd0004cc7e80d304a4f121c9abeda222c8ce5aca409dc5f824b04a4aba957f56589d74f22e2f4e0bccb9526be89f58256163aeb3e - -OutputLen = 64 -Secret = aeec6374ea3e1807cd866006b0fc10b49330d3757bf6cd001af584a883c64035b94e19362836c459585cd0bfcf1bfaf2 -Salt = d3de84a5427fba24c92892ee8e9439d622b49e57cb9a28bd1a81cce9debbd3662db1ad284ffff838cd6ab39b3f023d61c0adc2abff51f1d6fdd1b1bb8ca1a5cecf315e051796f958f8425d85648a6952be23d2706b75e8247ca2bbcc8342cd12d34a79 -Output = c52eb773d883d8a387c22c12925cc25c3bad6b5eb4b265a6c8ae5195a0177ce49c01b6f5830a51aaffaf183b059ebf3fde8d696c6ae92f80a851fef56424549a - -OutputLen = 64 -Secret = 6964fcc5ffd050779dbce389170df6e8628c02bc8255dcaa32fd8ccbceb5654ee91b57c61fe02ead94919aa1cc829b83 -Salt = aeb865a092e401e57390d2c1c29488dc58b5fa75331f688b6b05a43e2033ee22751719ddb199c11f9e63d8c91f0a3807492926fbb86fe9450e79efbe090a979e25b910984e8c00fe5365ae5052f883f5c1939260a0c5e107364823682314415eaa81e7 -Output = 0652fd1c14bd127cf1388d9733b57ea2ab565967ca927ee19b8aa7f72338428d9ed5e68318b27f063b293c9e38eddf42ab9345e57c2d2da28304ac5b61b46e34 - -OutputLen = 64 -Secret = 43fb7213b6c498ed2be1af3484473211fe483e35aff705a8cc322677fb1c56a0c7ccf66dc2a0baddc58546063f7881f1 -Salt = 0d06fbecb44771548fd8f8ad30a6da7da89cd9b1ba6f1f3a010f368807d9097cddded279a6a5693823e937472cc2f6d906e69652adb36cb0397f09af2ac6e1761ac043d65a16467e2a02c75ff7f7d83e44a5288790bfff8fdf45f221e9956f0d83166d -Output = 38dc31e2a7bd6edf710b27d868acc62bfbce8467b117c8ab60482e4cd55b768a53a2c6ca18def2933c5eb5ad7151b82a72d3a03cc414e7288f0efc24e139fb31 - -OutputLen = 256 -Secret = 53898d20b393cdd6629e16449a05a3d205dacb01ae9073baf5b282a1b553be72a651ad5725656bbb8904c168cbae49d7 -Salt = c45e206b2c129a717681ac056a6b71a7ebee6755cf1daea01d9ccfbcd7f97e31000527f769b6d81c25c86d7d548341ea387c2a6fcd31d5c7e0e2a6036af732b4b62606e736a441f98a76e9dc72b39c02cf4cf1c4971bac3137ab299fb089ed0c9a5790 -Output = 3826add60a8541f29c50600e7f17549bf49ee1d36d9c868250f540e47a44349a74a6507e7d62f2021a054d31e804003e07acac399974fc1a91b4a5109c49f895eae7491f4747c0335363aab37f2bba4fe034dab6bce460a23f6e3293258a86c397eb72d3543c8a011146c6cbc3e80d0a82dfc8b625f522821ce92507338362aaac623dafe9501c1d102ee345577a30b84ce232ff5d6cff0e2bdbdb2217fc01307a58bd77b57baf3107f7c91890b6b3bf5c111bcdfdd11bd1762805d9733160f7faee7141ec246bf12a6422194eef0fe3582b23bb4749e2dd2bbf5e35b28648d8517e55ab56f47cc9cd24164e38dbf50b06d0f8759b0afbb60c5cfc052016f78d - -OutputLen = 256 -Secret = 3451147d35f9b1ed65790f07d00862ae563921794f4a1f2aa156ede27a43df04104f64de251db48d37069bdc7a669e92 -Salt = 88aab1708c7efc049db511a7bc06302b9807442c63af74d25981ade22345cbe46ad1c0b75cfb67b417af1b1c5776159db336f53d632aac1af51d09be7393507b182d4e2e0a05fb793abbd90e20ae79507d802dfd23fd3b4d66f01fdec14b5db2d6a2a0 -Output = dfd0fd38fa69fcf823930aedb67be3809ee55bdc43385bc6a47e61804db2c7af0612da3fab3d9b992231d5cb77996566d830f8aab5fe5e3995945c35a3535c765f8b0154e0b6b479f766a07e4514a893b4c452fb900de1102db4c2c7981bc0f04cc12761cb4f693a5d0c01b28a28f6331c251b7433439c89fe00a96aacdfd0b3087376cba170c3fe0ef320e52c01794babd99e13a8697a11527b0aa37a834c1457f8d21aabca0a6cc31ff7e4edebc53a31890a07214780f44fa8054253e989f6fa2011d87d61ce6d630d588308c013fff98abffc6c7fd44857d9412a8d17e1f1fb2ab23ce668503d5c04e5c663fec769b316b9e1296f9b68f1bbcbeab5152189 - -OutputLen = 256 -Secret = 27ae23c18ef5376b736c9ed18c510adf25c043a4a3d22693c4df0b6639c7ecd71a525b4b4db9409ae8e331502aed78e3 -Salt = 674f7106f3d2de27ede4cf0b56f9d456a4e0672ce9d5b188b0173fd16387cdf198274feacc0c7b1ed935caeaf623bf4fd9fb511d7db4dfb4db79f9b4620ed0d444df771df7e436852f6b85f3d0a7d2991d3278e601783ce10e44cde09f5a07e9627f75 -Output = 0e89d09b4b934e481b7fa04c0e3170ca3068019e4cc44072a34f52fa7c5c754f943fff53c323503ea04b1e7227f518fe4d990d3d96603f119545e0c1ea9c4882a1b7abd85cc05a21c5e2bd6cf274cd681f77a178e1d1c1ce018ad0ed8eca4b9596102ce5e9145a763acc8debf2788ea11043a9874ca4a660cb5492841236f4ca1edbd475f342ddc5f07b5b19d19e56a0722d7b3153522da4a47d8fcff1b284ce70041b4fe704ef341d7eea0b6647fb65e947efac7e15651402babc869b0f1417835c4aa13ad0742497b5d3125e42bdc3674c4dfbc0fe065a83a7f3458f7c3e7d12be0e763aafe6929f4e205e21b56d12687852f11fedd1183a9251f7af824362 - -OutputLen = 256 -Secret = 3d783608feb7aa6d68645c9c09c78c3beeb7244a7cd4ed467510460658286639c96363be36d91e95008c70ea57dea746 -Salt = dcc0d16cd0b67895e466449dc73c4c3005ae9e1b3f23c64e80bf4eb2e17989a6e96b1a8206883273f3c5c0bae626ab6d5c514919ccc7010b4cf6f1fe4985117e4d8c42dd0ee16675bca9bc20486aaf929dc16472b70332ab2c1e95c393c37f44dc7997 -Output = 1b6068f9d1a5227a73847747252271aa6f08dc45999265fd59e96ce675eb102dbc02cfebea886bb46720510ec4ff360ffaa25e5c7a1f1900b7b32f8f1522643d2ed01e94829b7bf6e53ccb9146fdc5902b7d11a0f2fa6aa2a379965f070e769853e8a0879a4d0824ac9d8dfb16afae01255924bda40e83c8af00c1517342c648c1d6b0a9c5795b204147198b3f4b18376759bde7522d7964675d88400a3528712904ac27c21e238da0f3feff9360930a4e837af9eb539dc2819a8e52ac1faf317e560dc950aad7e6f0f059a58cd1c47d5a556dd887fb2aa5fa1f6d21d19788831c712f82cd2ff2a9c99aa1ebf5cd06197595ee0dabf2255abea9b1b7abba72f3 - -OutputLen = 256 -Secret = b236de52f00456b8d9623e0dae50dc5169feb29a6843b527679efbca5698f7c02090131753d5073f7eae6905a60073f1 -Salt = 553a66b33f80edf82e17b19bfd0e2e9a63aa7029cbe9e002a1bc468bf8b3c15497e299f00756dc9165cf359ea3267305ab56695b98ca49cab56392b56d7277496d5ed8662d4bc059381d1a8b73cb63e45ec9b2138b7222a6fdd6cd8275a4ae53971f5c -Output = 0845b29d1435721c8c442413a7dedbe44d728bd610f1a63ebadac9be777c2e04ecd6cee2a0f19a677d97ab0f24dd240c1b39ee9d4a135e62dcba46b0cde6ede9a05967623e0fc15658fe53f0e84aef73d916304ff98972f51b773a36dd297294bef3dec7e1f89b3b8ce0431da809d93bb24d7cc2b69f037c747cd2252dc0a7ffe0377661da5f583d9af08b8dfee5470e8ee499d7c462d280fcc44007f6dcf64e45b5bbdafdd4d6c4e1a186304cd9a148183600672e94401e93a6a67ea8af0a95a26023754e62b4a283059f72f8ae1bb5cb50a1a9679494193b4649ebbb918a0989ae622b7bdd7d01bccae6db7eeba6868a2bc1c3e0097f96db8c84a408501d05 - -OutputLen = 256 -Secret = b9b4fb39905dd6f5e26988736588ed5ea64e0a0d284c2243ed511bbb17346dea51a6b9499120c090766de52dda00e90f -Salt = a5e04b4ef1b456a28af697cebb9e8dd6ba302cd0c2b181e3c61fd089c4f06a0d269fbffca0fd722c234393f13d5b1e4b963e0e6d1dab1676785a5b12ed9c4e08198c077e4eb54bb22f20bce0a4d7f88ebb7903715573cc59022e3ed34aa6e3427efd82 -Output = 1ba999e382d1969d228611de6bf4b6c44e1fd52d8e1d724fb28c5b78c94ed41a0fd4788a103a10413426b5314248db54682a0823038c38ae78f9bab20352c66059f504549b82f0e0c6b6761eb344714d02885862976bd5024815b5be8a0c6f4c19a610319d0bb500b94cd345f31db87c6d1bda6aa284325d1539d5408a4e8cecb91e7f64deb56178d4dbdea0a227df48f6a1fc45a180c0eeb07e1a5f2cc90f80b6ac44355b414b3d7c086dcd536fd3a4c046b232544c398705a0911931046ce9cf5739304a7c18b414b28de6877892b7feb0d00249d6e95fa2eb4a4e2ba2f3403efa84d9dc3059a63c41397efc1febbead19a1098fd82c128994d6ce34d27997 - -OutputLen = 256 -Secret = 7ffdc2db43b8ac00c0665ac80fbbd3ea96ad84555ba050aa588011ea56a19e3bb6df262ba360b1f9ae1e853ecbbf04a3 -Salt = a74a69e84963c873d2cfefce95c343ef7a436ab73d2fbc62529ff12f2f499627adb0a46d539a5ea4658f79e455a26c41a7c3c2cac0f1f92675f6056da27eb417ae496c75d056ff0d2e877e8449880fd154da16fa6800d67000d81a2a788bf305add3b5 -Output = 66e2eb1a612a1d1a73574b65a3ff2a683b91e2ee14b29d266da9100eebd88e31840d0a18d78681ea769088437db3f36d4b22fa8112d3b9dd8f981b39dff1ebe88cb784fd39560be9fba3f746e49da3ef0ae7371788f58dfaefda4e6143abba15e525300fc2bdd6adae27d85b14dd486d2dd2d8601831b2d162882f84c3976117267941305187c5ba19fc28a9c69a9426a4ace0a5a19a7048e4f09b19a4c103560f68a6d9604d30b23f1cd31a74ffc583e4edbff519935c0fa99ca43cab7d32f0bd74fa54b6bbbccd023b0701104b80daa5606f3366b765ed307368848782cac889e7b970c9d6e09f9af30bc940179fa4c6ab6b78c11d350a4075778570bf3f4d - -OutputLen = 256 -Secret = 8e761d44e6c15ed9534a8713bc21eae7b33a5791e1a24b1162862545cbfc509b2861c928f5f82bd39c9084d832cb7d05 -Salt = 8f376a3e892c61a56d9a55c188612ad79bc2b146ce43662b0558c5f693a404436afc87693a4308577fec64cc0e5b88f78c67b99574b8fece770cf2d664b2613724e9051baf2248c4d607fa4f7c987b9c417e3ac9ce8c799abceaf1d6800076de09ebf9 -Output = 2cf5baa3163dba32c8c650d0095d586df5982ec903f02b7ed342712c6f09c7cc42b927d85de0b0a3631ddc0d428b829c0f07ee28807def0b0adcffc29a57f919f0bae84cf5414d18a464028e3e1d2ccaabdf9df4b0576fd0c827a42fb2e7cd820d592b1dc6d9732843a93c11d5edec385dcab82e2f0ad31d05c0c46ee9ee28ac94352efcd20482b336ac9016869f99c15ad8bc53fa479156b064c7feaea98d3dffcd7aeb3a9115ca88f6d576022abd07404065ed1700b4cbd6814527dc91b9f3b947458f9c1d894d40e4cf85eed0eb846e41c1e4c98783e4c73d2e8df3bf44d4bf296dbb8a2e353121f6e2525b9278f57347832374434914a2776be2bb143a61 - -OutputLen = 256 -Secret = 3e642277748f9e6890d4beb87dc9b9a312a748c1e0d8ddf773e79374550ed67fef35c182bf6f9643010d4b66dfb7563d -Salt = 1fd976f5a9b149dfad5f5c73aa9d402903af248cf7f74d4cd3128313e00cbac054dc6c53979c1baeb7eed4b0ce57a8e1453150b1f3f413566399dc8ae1fe05957853bedd384fece19ef97499ec200fec8ad83559a6c8e421ce75a7ef4e62dc820c4eeb -Output = 490995b83ce1bf7c33d8fc3665814e50015e47c4e5fb67693ffc1a6f759edf0f10afd94d8d133edd3645866f204280b2d4818d76fe67d9e20ffb23c609daa08bc629c3268a56ca0031431f5a5e50822b8e10a6fdd3c56b80ea5d4b8bf5907c8cd145cd0f4f6073055a1d6a32349c1b9fabc77b9d32911c9cafa1e5b66cb8b1428cb721a253d43e8f44ae0c4d498a8fad97cbb1ac8f721c148e507118a08aacb3ac7e8dc6c84392a8ce92016f71871bcb267cdb95a8e1fdb0f780ba2711a1af40cdddf781df613428c5a05b925434ed5aba085c530191d2598545986615cbe00fe5af5ff27c96bf863f2532c49141cdc205b72def18d6fdc46111aecf287e991b - -OutputLen = 256 -Secret = 5b68795c281b3f680a95dad10edd559203125ba461e84b9108aa6059c0ef4550674429410571a273faaba6c2bbf0b497 -Salt = 609099579d70a5a7794cbd567f5b7c51f9859c8a7b4c2786eaef1811ed61aa360a8ac44eed9c20ca5a788a94e0b6855c30cb620b5be10c465a0c79368328efe68462cf6ff87f5a3a378b6ff910e28dd7550596ee732df98cc65f23973c219705a61d54 -Output = 4306ef8f6ee5e07ab7d51a389147b3d9c7ca054a0d08d81f68502866c4c0d6033d9dad704e1e262a648cfbfde8699d126d34f900f8814b47892f126ce4eb26a1fe1598702f926f83161d793d47113b6ef39bfc5a3dedc923fbd265e8335191db55945c390b55891bd0892b54e74e08bf07b2e21380216e1966300d9a54d4ad37c73a18b5b0507ace700fb3178613696654b1011722621760f12ec703f5a17404c8013fa8f1c4ea7069367a7f739b14a04cb4e991f67500da47df77576aa794291af1b3c36292146814758ddac0e3829cea0988cf0fe9006fc449af5e13719e0eacdd6ef5556e7e9b207daf3856809b918cdb7edc49502f516fa4d006cfb28dfe - -OutputLen = 70 -Secret = 5120055803e8ac29c8afd0d00d77417a8b250661f0ff176b8ce3fefd711dcce12cbd9285cd49455308caebceabdfb58f -Salt = 1306c2dda489247c2c882db7dc476233ff9c4781070c1b6c8321fa12487850928b913756f65e657dd7acf08280e14ba83a43cb45315ad1214fa156ec184161a757c972e1364b8bf0904f2589e78d2dd222795fa8d5c48bd66bac7f2d4cbc2f9b620b9e -Output = 7b0c0f8c4bc39ec237b21d65af09d8805290f382219dc91d19bb209285166fad4be66425413910c55f9fc9a49035679113e409aec9c78381d17fdc860ec8146f1556cb417a32 - -OutputLen = 70 -Secret = b8dc17777827a38b1c44b9f525180a806539ec6c5ade0e06bd6223b65e5e8b4fa9d38479c5104008babb724ad057abad -Salt = f7ea54cef328295e786c87e28e50829d7d06bbfb4201826dd54f205a8ec49ac4acbcdd3845e3b79272f0a963f0f5056e2a65d7d1f4b2f30f6d9a18cc91f8e3494e68fe85315efdab5c6535adf8776ea44a997cf8b4511a3a1c0713d88bd102fa06bbf9 -Output = 6e1ba61980c9819ccc7865a84a99559e200d675a90ee3c893466a29f2431e048bc6e9e2291cd7999c4c699a11fbde497f287ab107e179d2fdb689b050db926881a76f71758f7 - -OutputLen = 70 -Secret = 573c7a0cc6fb8e3bf9d45780eba5803b36c667a6b26139e31a54d20484baa8c528024d85282446064729fbdeebe623d6 -Salt = b28d61950a49beb8874d868a542ac89dcf3f49bdda93773b8ee9174c552ade5a37e90b075fa69b1eb16e4b6138b4eb029e079c55692b183a2fbd7321b4937b2f18232f2fc5130bb78aa010e89bdbc8e219de9554d05a93935eb855e112a700e4e7fcf8 -Output = 7ba8c9777afd8f031ed2c471b168461d8b02253fef46407be271afe65e3bf08efc541eae134daff26c9293818523b0e2df996b842536fe4a90ed8aa0abbda883db96fb7b69b3 - -OutputLen = 70 -Secret = 4cf2210fec4455a75ca009a42d17f067b2b9408e831cac36abac8ed72f309b00aed564c4878558005f7ebc7830dd71aa -Salt = 928b15dfaff51ba18011b479c0986dce37b8c54fd7b844b2e12b458710b3acdcd8c5401c5be3c74984dfc1ec6883b97ccde58c4eb59442ace4a394d7238d8e6b1f9fbf85fa28d3b8fbcc9d2fd852d7ba10965817c2c2c959410ba2a06426ca57b7550b -Output = 7a70ea1b0b8840402c133dbafb8c25ea7625698938c7eac80811cbce33cd02e398834c03e41bfacc89e733f8327f5c0b5768039f40536dc704a43c62744a4088ccdfbe599eeb - -OutputLen = 70 -Secret = db05841c66c774c99a6163a8b4df6fc966cdf5453e4575cc994b5203d74c544a78c014dd98a87d1fb86044fe393f236a -Salt = 9ffb1871fc07fca7313d03e994e7eeb53f029312f0a56f635a0a914bca8b17c3b20634a645cc6521001fccf4ddfa8b81fd89b5b8b7fb77eee43119e2102a7a8e6e9078d59eeab01e67e819112a4d0cdb420a9b9011fea51311da4058592f37b4da9531 -Output = cd5b783eccbe32157d1dbce5d4650152811c8c17e92da8b1c2ad81d6dbcbb02b67dd9327bdd431b559bd249775b7a0ac262de6671ab7c345e818ea33c7a2b73dd02dfd5e1a55 - -OutputLen = 70 -Secret = bd7e88a4f0b9735572156c979bd758dd1d576b1cc03a8f24771adf0f233f4fc5a1d357e6ad8e4223ec041a4696dda425 -Salt = 684930c48ac4960d19c2c71b0a5471fa372c1b158c70a44e4676f54c331d5d24a40719435e0d580bf981af0e3458dd9522c389e2195bf8261cd4c119293df67417807889f4188905ba427f31fecd616decd1cce9b15e51a4e8339e86ce14fa37d89676 -Output = de0f2ea3bb151fe425c344ec6e30554346f4dfcb70c4f8617e2ca881c85aa1ceae7d3706ab5967711f1fd1f4a59db02acde1cc950630ebb421ebf3d5328484274aff60adb041 - -OutputLen = 70 -Secret = 992c78406aae2f3663a6fb5a0956fe335badd670372dfd36c626f94a40443b19c867b127e6222eeb8fdf8e8e464670e3 -Salt = aa59ef4aa1634fb1be00d545cb1b91e1e8981ddc68413cee5fba775486a1fbae6e74551c012f77c5ccb77a0caa9b113f497918915345ded4cf3a66747a590d0b058fe10491b488211a8606c1b0f1255865d530625f949f7fb644543f790d497c68952d -Output = 3064989fa166a8935f0400cc754f7b0d50b9e76a57a2dbd8935b3000d5de46f8edcafa7154384c3395e2e8d21bd33afa9ef53b0b11049d9ba89b8f42852652514250969373cd - -OutputLen = 70 -Secret = f9491be20090f03d1705a7eec2f24e9c36aa59ad92c21782f042e2120de76a6db46bbfd802fbce7f02ef6bf63253103a -Salt = 27bf700af2286fde4699ccae7dc614856c832e3ac54c8dbc9ef3e7978c3943bb695f9b4a5077c478fac21bdf453b077210d64184d8b99da3a72868ca36e1a3f30fd12ad4d65c0ae8a65277e8348ed4eeb70ffecbf25cb4505ef37642fc60ee4716631f -Output = fb17fdd0f5508913f0f7be22789a1bcc17701372e38f6f27e0e46083ec8b34e84f7f2c6bf4e865b056c37f0a979ea21f42926400cf95b723903d75d41bd3bbef963e8dbee010 - -OutputLen = 70 -Secret = cba0445d9babdd8556cd5e8a5cbfd219f731f23c607cfdb8e1ca7943b3f65f86e3692da3da27b52cea55ba1e4b2a3ab0 -Salt = 563e4769ad08a3afca294adaeb10bbd1cd80181869096543d4809377dbdfa491fe85caa76bf29068dc4bab33331595fa3f15742abae20d1c2546c1332ff77c69e0d06801f23e6c507467f8ff686b55bcac990bbf704382b9f192adf8d46ddf36bc44eb -Output = a7ec39e82b060670add0c0a247a236f576fd30047994a67dc7d7d8670052afa37bc305df5ee2d5b8fd6cb782d2c6c5461be61cf9902936db997213befe6bcfb068d8d4e3de74 - -OutputLen = 70 -Secret = 9b1e35d6301e29acac9b9addf91d2db6aafc44c585137748a10e0ef1d4b4f088eb78d2f5b88c8ca8834956370da69287 -Salt = e933b9987e167195dd083904bcaa6276046903eeeee459ea893c51d5a1b3d84b15378645f4ae25a0ce989758c3d0c53c3f39b276a510a29562d359a135d386920e8fa6c6cac2732626f548fba0cb4ff0a7c956ef66ca681afdb802f187a5ee43bfebc5 -Output = 895bac35f9148285f52c238021c891d0638cdaabedd9dae9a7f82c98d44990b9269ecec02725f84bcc6ecee131005b3d831ae1b2e71fe52073a0f791b6f9d0cc90a74a30b77f - -OutputLen = 300 -Secret = 8365cde0a214b62aec697f7d927bdd6567cb9e2e28afe0bdda6e2cee53afe758d6760039e7217ad208bb58833f01ff16 -Salt = 5e81cf14f432565dd98bfd33886303965bc450276bd0240eef3ddc7a05b00de2990260a823573beb11c65f5ad0aebe59c9e536612469bbec4882ebe7923cdb5021c47f31884bed52d308caec5334637ec2718670cda0ffa115cfa071a53c6235d877e2 -Output = bf387cf90d96f34d6d29ab7fe2201c547517f5e231b5be4c3960cfa6ce5388bf622a478e983c535733508b39ec781ca82a89a03fb32e9d64701e805efd36b56c26cb6ecb5197a0feb1b28d0dcacc8ed4e60442c6ad08aaafa0a1a0a2155d3bd37acb29c001a37caaa9aeca71ac6dfab152b4f277cbde84bb7a0bbec6c0711970d04e942173345ad0e7cb4c999eed1d30370e13888ec2c4a3a2e1c94f43a588521692430a64fea4a2c50fce6d2910c16b56ccb509a195175a1e53356789eda80ac735928c579fa0a14ab1151a74908a11f24284c91283bea2b391ee5aee39df0ea55d15682e4b4dbe434d0fd5d5af199a82de3336e1ec3047ef7048695d6e021a79653506c488daf5226677fe346bf7bcb5029c44c5491895d90e6df7802f8535fccfb734c7c0171e1f02fc44 - -OutputLen = 300 -Secret = 65ca9503b896bef76f2e08a9f6c909295dbcec357f6f489dfb8943ee079fba28047f7d963f6f9e8bae088ce9434ee37b -Salt = 8fd46c031e94c1a03f959b4b3e2c35795394fc27f433f901be8de2a3ae6826342f00a0e81a87c65b27e6c2ab8b37bb185ae1b0f6590525febbfb7a3760209eb9c9381f790fe9a083705f487f19694ea1bb3edc5ee9b5c13f4db30bd17fc1ecfc35e80a -Output = 73b58b0cce823c28c51c143d0a82e402d9cbddea8121e826f82a1da7fba9734c32108142db39cf2ee6056ca13da284ecfe452a7f92c0b377631869d29d923cffd49b5f3517717c938bec82d7ecc549d38807e8231ad096aade668f441baac01630d205c6d8a622c0b6c2d33bedcb351a40572bfd95128c58ff3641ff9d375bec14ff6da191f77c4138add7e62aa9e7d908390af8e6295457712cff27cf1d1dd87c53186d109457a89bf04b1f7d092f97a6c71ec7cf5d4121e6b7146f988297852e18f7af8110fe64ec1f808a6e2499906229e9c25dd22b72d5e2fec5918038708d7449a2fe5a7e2c4122e1299d1ea34885c1aa9a6110b66ff530a8c39eb5e3029e258d2771ee4330c620a0279b32e87398d1b2cd89b5f174940f9d82dc131bb941b9d39afa959db8b6f53538 - -OutputLen = 300 -Secret = 10f2337665e7aa186da7a9e8f36320fbe1f5d1bb86aaf8c841b4c63078765e39b7ab29144b849e2ad02be5a556dc934f -Salt = 231cccad23324e0c0a32f0556beea0bc923ed7c01694e3dff493d38d6dbd3b9a96831392bf28af1cde2d4669d30c4d5348dbf158ae9ee1bf7a88cd6e5cc5c62812524f8910f8b508f98fc4c2e4bfaee7f7bfc84cca5f2a203a485a10b7734a96e7a2d5 -Output = dd02e9aa475d57c05ec11794b5572e290506fa57e6693b12ede7275b27bdb43786556936eac2b89daaf1ce08dc130f82228f9a346fba2a5c60860af93617f20375371e0187c0d9641009f844dd54f779e103ec2dc774e30d7bf47b2e11ae4f9a6215549a81b55e0d2176535c154d6a8b0d860dd0ab9a8bcfebdc329506e6675fb712c4e67e138cbd7d712556a626d13a288035eb1820301c8fd615ab4d2a6a1bf2f3a218c0cbab24b3e75bc81917913b215c5e6c6acd348a4777c16c96679c9171bcddcfc6dc22c16811b9cbd06e353581f7567d6ccff4bfbc72c2ca6a9027c8efbb308facbfa8d983cf630f139959c8b316ebd7463a6145c3fba156798e1bb86501d37d5dd75242c198828d8449e7ab295d1897e783fe66cbc99170212caac36bf5373072fd80ef6ea16b4c - -OutputLen = 300 -Secret = b322a131d61a2e5b766a24e7f27c96f1fa170b1472194c9b1e0f80280d99370090e4e6437e652c5d16b5294e3dc11628 -Salt = a31f9bbb0bdbfd5d1de1ad56f1126a3e4c876528c288656b44047c88eac26679c2680e5b6ad50e92ca9c6fdda6fae61eff79c853a9ace46112da38e654f6c2d7cbb150f223f29794344574dcf88b00c0b865c7850944b01bd1c995b3c5b1313dd1e062 -Output = 5dadf8ce0d30b1d10ee3e5b89bef6eb442a3738f6926023222f0374d2795f3cb63cb14dea57f4b5db5a24f49db2719b5e6fd5019dfdf8c24b0ad41a5f60cdc7fc9baf7688bd969746cad591c2261143f19f365ac093578d0e12598d1f4ca740ba47e4fa850c51b939ba5c092569ac0d96f71ec3692d3a7b86a409d179f372c2d449c4046991bb258d49fcb64cf5a2f29d3c030138d00134db7c1bbefb4c815c454864e8d547d539b19ec8537a4412d0bfa1dfa60bb3488d459f139d60eaef35bceb77519d16e628076c8b208008f80fe2941508e945358d4b4ef7a6da813747ae01d14e711a091626aa5179bb62539c592b92a5d181f9e247be4622764f46b4fe7d3d54829860160eae75b78af4fb4d41bf512d20791250925b427b58d40444bed1b6bff316bcc14ca908321 - -OutputLen = 300 -Secret = 73b9ae83c1ee598761749c00abb375b557a867debff5db23c3f66962646bea3c5d53e4f9822fcc01730d5b8ab17504b7 -Salt = 94afd2b77048e49a5d9cc7c767ec4183b96c83a6478868d1a14e3c20a2c5e144ab10b188438be2367492f0ee3cde54669a5f041625f29b94f4b248c14bb53c180d525dbf91ea9e5db7e91209eb546b4d326663af22757dbebf5ad5f16636e8978f2d29 -Output = c19cf8d832f12be294c87def8c83fc5691d6740d070da2b5d5287b77f842b7c27798fdd9598cf994bf63ade8ec0ab5fda4b53168b8b395b7393178fb9b42006b5200d8f71518883135df94f82e8409308969cfa27560f1da2fc13253d5fadf6d4d7ed3ba20dac9f871c911520826030587250b6a130a6e3bd84bd5e35510208e26e5830d0ab27efcc88fbab7d809202d23f512c0199336b1110e927d02f5d4243ab5fa1d6f061a9183cf39eb76834dbbf95ea336fb9c106d4aa9949b1a279e634d9b6da1c4d81782797dc49b4ed7b36cd54ebe0f89978145c2baa16d51b5f15e8b2368c219e007cf121cefbb7e750de02d0e1fbd3f707aa607e6e16001230ed69b61aee5235c881b4e9c3f7d44ebf4b2196382d08ddac63f57b05d16374da5e27304eb42264b02e3feaf396d - -OutputLen = 300 -Secret = 4ac3e05f7b5da097fe8dfb7150d3dec7decef77816639a429bbf1dea45fd7b7e6d7ff1275a88c179ec7cb3c1cc500beb -Salt = a8f98719fed5c6013ecebc071ec2991d48f5bdefcaeca84ee2e3a8ef15b5a95cc0decf4632a1093c64ef47ebb7dbd64831a7ba7ce92bbbafb8db56aebcd0c362f8f12cc83a809a3cbf16607af07615a48457e5ae76f92038f0217d8d5e8d2409577ec8 -Output = 39599f41ef592708db8c3118270f3f1975c811b7971436a061f695f36bdd0945062b8da2bd07880d860dc7ac16324367640127f7ace2909b0b6c3ffbb78808a6174c34d6d6c43792ab9a8cc7cfb49093ee86d6a26a53d2d74ce6f5fdee5b3d41ef44586484c3fe4923bcfaae305cbe3a846559a119684f102c619ea85c01c5ebb6af3c6cb89d8565b8310e59ffde0158c6a4f972e26f1f837bdad88163aaa08beb6072f8b3fd6b998a67903cb1ac09e2e18679a052a6182ed06aed363cfd7e6e600289d6dcbe48cae7afff2c2beb87332734fb234177be8a594c38a6e2aadb3d7380b7ac11c46001b87668d8f042877ff2831826ba23812ffc0d01461718a7a1ffb2b69a609f7b8a0fd03511ae46876bcbc6a9dd86ad1b4a3f309280d5b3a5844f4498777d1d802db187accf - -OutputLen = 300 -Secret = 0449b52e7a8c3ec342c6d088e56e5f1b3357d9d85e8001eec7440a6462df08699b28b56027727442ff726b00437e5fb5 -Salt = 68a8a9b0bb0c8d2cb1ec3a73db80898320bb3d0ee67f3a9d51574e9bb1e4b7b5b69e8b863bff570349d7c262d156a4d8de8b872c9211e9113b67e4118c3fc5cbd48e6688b1fc657c67c08b8cdfea12e6455c3c67d8db04a07d7c0ed33506fb32a72a1b -Output = 7a0badfb5582c5fbf8c6f3b7d8a82b2e1eb050451fac380831581c7a1ad16f915637020529c6e9928f7b0335999c1ff6232563d63d0057372b3633e33ebff1ec5078ee4b00a3e602d5e02418e74eb08ea1a11c728d57330aaa5091f7df32a7e7e072eeb909fbded18b007d0ecdc5c50cb987dd0be221e2b36962ee549dbb1e49a6e0b1f1c7d10c79e6f06c2ae87a016e59f6f8b84fb3dc4825c31fd508830e6fc2c635e528201a5387620bab46fe317fcd0febe1e95cfbb293ae86a42de82839a33b93f6b47d953e5a3070b6a9c9c4d7acf37c964cd1204cf7c9657bf35dccc6ca72d0232367d523d119b905a390c8573d46ec3b0c2808f3ba3f642a9f344632831ac116fa3c877e0d44f0e69696a9c2306933d462cea11401c3713571119fcff28bb33786dd12b57052e88c - -OutputLen = 300 -Secret = 7aa00027cb83ef98e70669fb1a666cb016e922a70d9ecc550598dbabfeba0858f0554598ecf7fed4dc513335af06fd32 -Salt = 538bcc41e294c24b9edc626fa94fd820e5a55db114a90a13e036d5551884b546a37d7101b1f729ace278f86bdf4cc2ffb24cab9671b5ebd3c0e282642d099aa34172c7dd765734d314660df59f11d2c09b454eae544582511150c141a67981a415a433 -Output = b83cf07b44052bd909a11400aaa7cc43449fceba80f87db7d09cd0199c6d5c0eb20584d0d73d42c8b35d92419e04f1ac11e9788e37fa245654207c30923be46681f6aa7de3b3afa867855192ca643500b47f507b320259cb0a57850d0e8180a1cd77246d908562cd8d3a20947e2d9d021d5fc7b1f9902900bde34657e84ae0055cbe8fdb80dd0270ed0dfa1243825c7a103dcce6bdf2d5052c4242b19a1ebb4cd19610d2a23a8d71f1aeddd12ad4572f178a6cd38b26f4de25971ec389dd97abe6e3ad90ab67ef334697e6dbf5ad0d265544c05f335aa785de28621318f4c3ba20e8d09fb6a0423871c8b74b4f0997e8ae6fd7e23064e43e970ca4371e6f64436fd586850a2df8d57ad59e5ad8dd89cc47849c5aa0b504f1092a2c003f86fa43ea5b0c248328099da2ee8e70 - -OutputLen = 300 -Secret = b9f1575b798ed7871551d8b8e36dd648c2be10669d0519ed0acf3fb16f012d3b3e85d99554cb4f6db9e560a4388792e3 -Salt = 077b33bc32ec5434a94b03e810acf7257ad65c3763a22ffe6169478d66e10df0038b6dc1c6ef77ee3c620cad11258ee8dce66066ced2ebef3be57aa8279920f10728fe4a4b9a86d5c7861361f2bd52478b91638ab9dc552f37f69dae5bc1b0799c8449 -Output = fb17da5e3a16b11ddde8d4022d2867afaab3b5d1b5f7802518a33308f72d735fc188531e389ba46c0d67c303e4415f936518941ee61857885aa4e553854ddb0bb2c0953b4f846e67e287db5fd8aa35be20550fb7f320fda0f653b3f5f719c918002344b9afecf82a0ef14443d1b7b4d5edb245200f8d3807a64cbdcadf8b947353ef6069a15cb6c0bbcf118cbb7b83d1fc91b95044abedfd239487ff568350cdc0bd5b5ee77b9d9bca0d1d2560c45bdb87fe3e5242758e9081f6c1386edf3abf0aa6a1494e817eb9572a8197b49f9f2e31fdb6c3afe828ecd2c4c0022abed86135a165179591b76bdb5f2eca6eb892bb84378586080208aaec07de1dbfb01589d3ae924f2b8a7ea0aed2f3525e302585e219e7d458f91713bac561f440beae7a035024d15ad36485f2237dee - -OutputLen = 300 -Secret = 62e7523279404908402881c2ec4aa9746786da9fdb4c3b0bb8903c1c533ce136fe31fca4b77010758e0b1c00787884d6 -Salt = f17244005fecdcc6c93fdd86e86534a608c1a2bc5845fa6c4727a7359d7292100c2e2154ebb5459c391f89761d40ab6ef2d7cd7b3e909eb5d78f6dacc3802ced02c1119e7244564d80e61d7ad880473b5fa9718afe901303676897b3bf701cd412655b -Output = 3613c68983d530bca281a1b79bbe786c301bce99880ec34bf7af00956546fdcd0ac37a4ef00949c9a63d658f2c540340f8dbe618e487afc6a0e1c15e5c27a28a9ca2ac095c0ca83373fb9ba02adef7545b4c1e2d28bbfdcee54a83ac5b1ca2ae1e31e8f1f416bbd254e0957c06f165a01e1f6c2e04fa69958de7d097849eb78593aa4a3e79b12e04f5464f5b7b73eed4c2fe87d1f51f21e6d2e9a7fbe399eeb8ecf32d05d64704f6523d4299cdfaae85f87d13b79b6a5c1006df7553fdd137ef9e6b4b0743f4d048031e4ebf53925adbeb1083e45022cca2dcd501504d2220ecb7adc926c2554f78457d9bf9ab536386f097973a526af5c6e29d4d9608dde4205536b9e8f36acee02da38fd33069ac1b0c92e3d40f2cd6e536df68d6e6d34f02d085bbda7af4ddbd0c574966 -[SP800-108-Feedback(SHA-512)] -OutputLen = 64 -Secret = e709c8f6a16e4a3a57949e1670d2da5f4ef4f0eb6aa28fc4600d3b674c972f5c1ad32dba29b3bb2bcdcc2d254b64b70962a312a5a660e659f53adb3f1962e30f -Salt = 51b08ace98a312062dd6edb0c45d59a245a6e5d18ebdf9054783508666f2f046ac92a8a93cdb1de702cbc01f5a830a3f4c545b85bab2a3d074df1bd8037616198e3f0cd15813ffa44b7987e60a6f8700623409cc9f9138df85cdec4eafdd2dffb3a93c1631333e462969b30a1863ced30d860e -Output = bac8a19150e811440ab2352631794ae3f4e2f975508d47913ef2b03ff2db65115ee02525c3adf34811f8418384c34310dd601cba3127d09a55919aed47d45d68 - -OutputLen = 64 -Secret = 02bae1d0540ce4e256a2c462bfcffda36bda3b8d887663107debb88ed265a850a8e59665fc46e912d6eef05e195def929153e624e4e69124a002469476571b6e -Salt = 042bd83ab08a082168ea475fb91e2d1cffffb60cef241272e435eb191e890b649966a5fe4fdff53dc6b92636adea5e3e1653ae3855e38b5bfd7eca083ae0e066359228111f7c52ea1045164c5166fa0bcaa91a2fe9a7061fce4f623a10a56a972321524ec6de84b3ce2b7fd76790bae45afe9d -Output = 30a528cb083b4bebb97a2bec10d93e4d59bdf3fd1ac62d642c4f668c9e4c0b381d85bb798d3932fc29b9eab1cc7b396bb35c138f8de3102042a1674ec28d6ba6 - -OutputLen = 64 -Secret = c00c7c6e03797abf345372c3a7c8a746bc4a510b1df1238bd8676ba335e504d038958bed3034cc7466da892bd05778effde6bd3a4054d9577d0ce4330239f514 -Salt = b07495ddc316aaf0cb1005a6854248451c6f213f89d831b39b17c4d046335dd6d6e1a6ce52ceee286d8ec50800439ac6c7ba16b080d2d72e6c21544b832e62f6f7620e88c26a95d667713eb4c4c5a65f233310fc61b2debd3472d1e7d84ea73a02865fbf304d54fc3629b4904a8871f759e171 -Output = b077e539c6434be9bc25cfea424a41176f512bfa45647e504852ae46dab7fca8bf75d5120490676d4e4229ca44b6d72ccb0319ff38e371c4506a599cf22bc84e - -OutputLen = 64 -Secret = a0c3eec72a123af6602ba803e02e19728c00a6ba362ca7f7262235f1653ab5134331bfd6c7d44f30485482f063e53eaaca37c65665a32b38ea54621607b7a364 -Salt = 6734edfd98f333d71623dc962ef435999a683fd050a3c9f711a22ff267a1b6ceca39b65ddec9b9af9428dfa65763c9f430ec9a67810b889136617f05cb501a96ea8c0960ed23517984cbf5314f14a3241c74b7c52015c58243bafaeb33fe5455a2164749851683a0935716114dca32d2c745e2 -Output = b11c4e89994c1829ae84a331249bc2f80be59a1ed815874dbd5a91667f7fd5cd3b653b96645d22b0ec34f38ec12f1b43c556836202650ad5740db30eb2d3ade8 - -OutputLen = 64 -Secret = 882328dbccac1159610b010f4e6057ca8a4fa0a044f573b4cffa4d52d4c2f100a6651967cf9f56bfe32577e3b01e5c1db6008a9f66ef934ac3091658d2c6e561 -Salt = febf10dda6328aa830c200eb32b9e9d7da7c75fb11b209f542e6f15a969bd56d3ae8c6ee6dc6b294ea8ec485adeea9f0c835431d826c042880e3bb201d10a71008f82bf0f75eccfac9e46127d2ffba0c5ad9aa004da081916e93268756bee997d3daf0c87c730effff87df730f11ef319ee802 -Output = 71112c2207280a5667598f3572a72fc0f01a27a81bab83f1a524345ccf787b7ac09aaa8ca49cadd799e56ca028b16ba327c65a1ecaf177d35159cca4a4f4feb8 - -OutputLen = 64 -Secret = d57393bf8e822b0715c7b9e8c2d0622d16d06db4965057886a564b7cfaab83f75a23fe5527acff5df56f5d20017db76c9427b5aa8d3f1a60ed0a23acb6c97b16 -Salt = d9e2dee252a15ffb2272b18e0728a6e4fa65ced7be1b86eaadb71738f1cf8282415af1080720b5e0ccb68d5f9988d7fd0b7298da4b4470f701b41a30e8dc8c5d41cc8dc380b36d9a38709df21a230f03cc09fb631405426d3a5c99ef40f443dce366cb9bf936a13c5e761a942d606c1e46ef28 -Output = 3d63e5457cd61c1f4eec39facbe5b041f473120974f4fb8a067160c8c25d882cdb6097353f581b25dc7cd00e51a96b1deb73be018e1fc080b55a90670e619bf1 - -OutputLen = 64 -Secret = 93bb31c61a267d173a485d10cf34394d367b2379a66c6b1d9da5b76235d22c5bf997b16af755dfc4963ab80fbaa83b1b7c15417a7c1058d42319a55de8ae91a6 -Salt = 0fd81978f25c4e69d3fe3bafc98aef828326ee6d7ed4925c76a1e1f0ee69127f0c397d4fe51b488088b8066a1b11520c800dce185003b053946bbc68f0a8475f2c14f024d70b167e5ed0c92c0301d61991f9338137c5e0e424fc14331cd6c1339c3e1e816c63251e4b65a6efc5dc340afa5e57 -Output = d37ec289a51611da6bb5759cb31a28712d3f0c4f14a67903d227e0eee79103adb8854f2efea6646f3c40b65bad95651e30d63596fcee9b3549eb10c6cf5de368 - -OutputLen = 64 -Secret = 883086a14c3f38feb14b6ee9480915a2861a025ec30392ec147de32c48e463a636b83c00ac7e55692511be79e3f70ad95836b5d0e63a4f21d75896022b1bba6b -Salt = 35ac4a1f34b8b330303a523d19728d7314861358e8d2fcbb504f6edc83fc201c882bb53c4080026fdd2bda9434592372350535c45a735071b036e2c5156a75c9565145c5420f1d689bfbae48fb2f68c5c3f524fdf49f165e307d29d4cf6dae65a89588c9e2c02d0f7927bfd08a91478c12042a -Output = 77ff69f0222cd4c935d1ca66a998c196187a25d1ac54220009346cb4aea322dd6783fbeba478bb25b7722d6f02121c887f5c794677c2e01c79961f7c04f68ff8 - -OutputLen = 64 -Secret = b75dd5340b0c26d36daf1b88bfe18d77b3b63786dea0899965c345b8920db289c6e741ee4f1de97712c3f6823bca0da23657a5bfb999f5a50c72663d298d0a95 -Salt = f539bbc36fefff38330496cac42a07eb4975f0c75ab749f36deeb507b7595cf080c86b6b0c18fabba241ce395e53194cd7f2bb0fa35d526277c49124ccce29266df613213c34cf07870a62a57c150d924cc7b14e42d51f6c288ffa399300cb23e39bf85ec451f41023f28ec5147a8879ba97c4 -Output = 672e6168f49cd7774d521c4f28ddd86bfe9d87ea797f4ac9c724232c2c113113769c0ef381855aff660c918e74de1d85921233388eb6109b245a2dc23fd54129 - -OutputLen = 64 -Secret = 79e894ebcd41a71fa863d6cee8719e754b12598393c8d0b32e399c85f4e4cc67ce1ca492af2bc8e71976ce9e3a20fc3a48c2b44be3051c0682ff0a03d086ef11 -Salt = 8ae5554cb56cad8e015f54170815501ba3e62b5f187517d560c0ff6160b91ec664fe4750131aaaeada02203bde4b4c541e5141b076e753a32cdf69c00037e0d9f9e9d1a8e614b8f76364009c787e024670c97201da1808e453e907656ac1999085c8a822b15edff656e688a64fdd91a5ac4698 -Output = 890f35286f7e9cf913f0c8ebe3c5db76e36803a3e001c6dc7d544e670b6920df14eb6f2b2c3def6315e2a577ebd7202c9cefeb5f6084f012cd9992a9503dd5b4 - -OutputLen = 256 -Secret = fecd7ea4f019aa6c5ba53cf6d9c0dfea2bf5b3544265bccc98f7d4e795000e0065ee5fced7526645f164d2cee905ebe83e32fffe5e2f7e51cc9d484cce6ad882 -Salt = b43f1cd3200e408a076f3157194c30650bd61d1bebf3fc4d87c07d3c5bad43bed93ba0058fd3cadf76a25269e5dba2a4e9086c90d6feb337e0ad951bb39eda933aec229bb77c0a086f1e9e6b53c93ff540618b62a1b61a492ef1b921e8698348107ad71ed8832f9ecbf704aff0ca75b7dee522 -Output = 6d562e56c588a09b2d3202f528f733eac41dd0f5e73fa2a3a7093ecded8a110b7bd05a253577f5a5fb230d1a81d48b8e7b5ce76b8f52003c7c01a1b7124df58fe75014938c83c96ac9c97df4cfa8f2069c4a748ea7741c982a0fbef6da29a064e96f2d8af991dd0bd9bf8d40fa2970c7a68f1d81a4fa77e1824d8b321a65d102db936fe16019c8c4c847b08b4c4f80d948cb2c2cc2568a9949eb3483380d53f84eb25dff4c36c4b0b3d776e566e1220a20cab537c83ec6fbfc378083ed60ae9123be710d112bae811eefea528c993cd146b691982d2bb4a1900b12d48c6f7fdaf2c5c3861dc22ab4378137502a206709f72d5481c70a2f331f36c17507b4e876 - -OutputLen = 256 -Secret = b3b6ff803319aaa47cdf79155240f2929e96ef647d14076fe580a2a3b606ea3195f9adfbb8c19a10072ea2508a8e998f5811b90014aea68baa951e5f41319d6a -Salt = d14c70c1d80387d7a2320e4265a49386fe9c4ee368094a8c8f5bb9b5281a70f3b56c10a73c02bce24c5fff801bdd6c44e84e4b84eb0f428081f326971533af850d3530e7bd470bc7e8961126ab8659aa73c723ac7c4300cac2e94b8c94e64fb785081c7f2c564c55911a4ebb0d427b39639cc8 -Output = 310511f4359425df1aa88df69e3e8c82ab6260a2b92465b36a1b24acfca552e02241acdc502807bd7d208df411eacecb7cdd78d84bd96a8e396d966e84d2092cea8a387f74b7393017ff66ebd0371c262421ed60c8da17e3189656c905af61f46d867cb350ac17b1587bf757efac3af98991268d40b0f72411096de0f084ed0f5bc91bca33e4e165717959f55a1a20043878d18ed9830f89a5b0bc0c5754f987829d468065df56ba69dddc51c33a0f11f4984e806614fe1697919ab076f564bf394e50da7deb324e0a158204819bca7ba98774dc50699f6cd668661c76119af34429508a1cbb6103fe79844d1bf961d3e2baa594d83992f1442f3d813d6627fe - -OutputLen = 256 -Secret = 50c2875e01ca92897a45cac8e8d369e30bda77e2f5dd0310a9f0d9c645329cf4fc8c0e3b80e08278069212e8f0510234cf1e5db88d353bf8c97f1e795f448704 -Salt = 9986f3c78962a8ce911596b457f0695428f1364697007e441e0262b6997e89587395180d4eeb87c155d4dfd171a397472c9d158acdfa8e5323517a9fbe586ae74f7b3de985813473785d3d941f0d922d24e17fe2c1771e557580f9ed71d412a5cd3a67155f2ab16c26bc9de38a3dd877999756 -Output = 7bf8e56fc17715fcf7f60104df117fb57bb208be17869e36729e23b756d5e09ab33594b1c1d8031f4f01d95e202d998ffc8f0089b2e9eeafe7b8604dd0bf83fe715b0c11bb951b0749568868a66ed2df1cab169c699f5ff6ed2f88c40d485bd3830288d60e93ea750f24b26d4a800eb48c180bde3b0d63082549ad79f4c71796e0503ab443340058060b67175186eda50b44dcb3cb8dea7ce917e9eecf77ee0c754c83a81c5e4eb49d17d9a380e48bbe9a1b21196bad171f7dd28926f0a36cf629abb1a0b5ab20b22777aa109de5d1245dd71f4c25f87b9fdce42c13642f0c372652ca464f6be6c9e88f3d5a5f4d188e64a1e780503bc64f40a0426079541225 - -OutputLen = 256 -Secret = 2ccfabceda11b95b2a84eeb9e1e403e9c0a562e457ccccbc7ef641445065dfd67fc95faeb50e7e090538ec99037af7e039c0ec02ffc5e2748bba6d828bd0796e -Salt = 6a7ad2299483aa46e32e090c64c8c0e6d61e604a596b57d66db535bc8a43f178148e80692798594b03e5f9a086967580bfa2b312fed8b81d5b35485b2180faf094dbdedcdcd173802fe2d82edaf054413edf4098280aa77219dfff055d217cfcb844271879f64864257fe219eef2e2c1e5be94 -Output = a9d7cb7e2fbfe7c613ca0d7abd6fe0adcf2e21b1770fba980bc15524fd52552d593c074d61da3f5d2a22af53a8c49fb61b5af0d58624732d2614ee5246c0f39ecd46e75b0df51e51fdbd7d461a0064cdb12bd80e5c002c33f99a643e393dd0793eba4fd6c08a0b21f5a50ff7f83316e38d01d28fe3911b8c1048953c5260ff2c620eab588c3a8c2ac03c9967b91c4a24eda4f70b2be14ae102548a51b5648043bc39a1d95ad5b0e8b3f2a04c94eeae1fff60eb06690502e4323db8b15c3fe30e9e9f402345c60ba3a97b34437749a067ec7b7ea5f8966f51f01886e079a1dd504e11f7c46dbdb93665a454ff767b92e7595a0ab7db5d1da35d7a88b887a72987 - -OutputLen = 256 -Secret = 21fe3fd6ca9f3ad2cad21105b7ef017c3555e7af2f392d91869570e58ce31eef6bcacb154dc8a1ef1c3bd50404c4a51411831c9f9eab64a805f3c5ddec097ecd -Salt = 13663cfbf8ad8c896a0150f4a54d96e85d1c151e8da21ca43412bed8469e2aceab0aa74a1748f0127f3452c9e41e8515596b44baed9e6de087367a71c9f12c5cb59b3c042ffa4122f565ef2cd275871af854369aa252ec98aa043f4863f6f2c1acd8385a3385f44b9c2dff2a114aaa172ef152 -Output = 1d7d95fa62507449ca6f8cbf949ce66495dc095c36006e682e1f0ae4b08c9a4fe400b7acd5aeec6c2985bc72884bf4dcc6d99530fafdd2f51a18b06f873ce84a1928ac3829b892674dc075431d1a84a88c976f10d7dfbd8a815a09ea6b5d06276ef05428f35c620ce2a9a2e156b991b7c37d7172a849bec5367a2c282596cd987511d8d490bcafabf69c3f903fa12300d9630f3ef763e23f2ecc2d19277ecb00295446cb9c53fa92c0f93a4e85ba6fe65121008b9f073c98ae3d1e032b0a38c9f46974008a8914909f98f331b800114ccf665cc1907dc3b16a413837c0db98076cbfe42142fa91a9020ea3bfd8c0f3715f8fe01f47b4c2cfddbb93d7b19c5b41 - -OutputLen = 256 -Secret = 98e98732bd49f03f8ff4831893e6a0d1781820a3d965194600f15466accbc26c961e9bcffc3249bb244cf9b80eed3d96aeacb3ff2c361b6a3401d3f64ed9e922 -Salt = fc7c25828407d3468ab866b0d091f5b67a0b52e3069e54701703cf670e7f29dd5ebe7098cb9d14516dae222692c8ca5776d9cedd2fd9cbccebc87b6155ad3971af345bee1b048df737976e363ae69ce3901036bfa970fe9d1e2be3c228188cc92c2bf2cd36549ddc4a42b9813a3a806311c5dd -Output = dcecabfaa893603b16b7381cc35ac2c51de100eed0e0a9f4e37d42d83c5a0a33e978a7c58a6dea7d22aa245dfb22ffcec6fc64259171651390c59b9985c586037fd3b522792efc75ba339825009620e98338309691b9d3b4a57e52913a167d25cde920450a6567d349ad7432fd66cf6c721612c1f35e5f12d95129a79f59fe1069d836a028f296f8faa4b153c0efd05f466df0477ba0f19ecc41425ac058218f4bf6535a92edf0573a57c5c7b04e6e05007f0a38afaa75e01923c006aaca082adec7c773c136fd39bfdccb5fd74277e3983f9d84c11ff311b49a623eaf8e199fcad575345881e2ea881543e7c09131b5761cb2063721518d8eb5a126525fa989 - -OutputLen = 256 -Secret = c004e020c19087382d15621880a534ef535992814ef08dd04e399afc13b4edbf0f8ca029e43bebbf1207c60dcbfbc398834fd3967810ad54369086004bfd4bdf -Salt = 965aa5a346dea3dc336c8eb14cd02425bb92a4d020a93946b71779f36656e1cd55908044742d92444b5614c8dba819667ecbc933f9759db7d6ebe273f7dfd063c6ed9c77aca426b3f9b02d98cde674d49d4d0492a826dd2d265e142be33d19be11cc878029c3e3d2df1571ce331ecbd48b1c64 -Output = 995e7d5323b0ecc1a933c8c1a0765eaedbfa5284c9b2727d5d2e8c441f655cd7f13badae7fbd63de5478519bedd1c8c286fd7a60f5bbe35c3e50e2590efe11d49e99b185850e1f60727d9074e8d52ab9c242bc04b7be55b4f67bcedb74b4c480ab24e253a71bea1655d9c03984006bbd70d09441fd423ce95d0203bbf8e48d9e302e18a34dd3c2623c3f517c429b5ace8a1d7d24de93f93484c75b80ad73dcfd9867b846d7954caead6736101974e3ab8ff1efe465d0efb5c7487d044915c444628dfc0b36199f2fb5c3a9e9eb9fd97dfd731f844b6c21d43b5a76d13aee1db8e4ef60e37baf734e2c86ae94ac862d60a1e1655a2a397906423f288012c13da0 - -OutputLen = 256 -Secret = 6f015d23605da6134634ecb8ab6d7be0085a24598d074dc755f8c6532911a53073ae6a58982f1236c445a268b0d9b9b22c6344066d4f46ccbe25600ae1be3aa2 -Salt = b3905c859a0280f5af79facf5a68674b3500a2b84d0841e5b580bca1841628c3108e21fe1e81b955fd27a64d95146f93a06e2d9b7bba5985c93e12f5d8ec6afc9407e829ed4acf92c47098ead66faae8b3db8ab07b86d1af9a85b2ea0b504b30bb71dcd9da0368d75c76c1faff0832f8f4ffcd -Output = 6a252877f04d8752cec4b1c939d1f1d47a476333a54faae7e62f8d94e7cc81de497fe725b33d9acdd30921ca0239e1526585fa02fa1bbdfb0210799badb8d62c0d20faf843816dc1ed48ae8b5595c3fbc40ba3aab3af24fd2d14ecc71e62bcc2b6b3ff4b379797f12adac09d4bf3384b70e4f4ea6ba36158998078cb1440568d4beab0548bbd84e50e12e1324800d7b502c1ea26c61b350ab0bca694f54fb828c0264ea99f7e77632c63882978c56a63ef470d1febeacd8260013ab5e4e240c72660f27700432a1d1904f40c2725424a2fa5b362ca52abcd32470add325ce0a8c53a7c589866d4c4aac26d41b1921ff654eb3032f86d98bd7431d1f854cbf494 - -OutputLen = 256 -Secret = 0c596f9320d4557ef39b3bab577673618966667f1eff213ae2ec29bfdf393a853c5d8f1e5cb04c60fd5c7dd079819d9de12937a954087642c04fa22676b3a7e2 -Salt = 862507dba4a2b2983a9f1001286e251e8d5131560dfa1a85b3274627bb76e57a067528eb9caacb1c292cc65471fc9900597e661b5e6496484c286afdecd0d086fa0a813e95da5a7bc01195c8778d19f582328801e87d40ba665c88abe5f7f4781f071a62cd85a1bdd1ecfc44a646fd6088c17b -Output = 7833f8a93dfd3f9e0219c622cda7150b2ca4e2cde911f685e774c6ce80d7f7fff1664ffdc249e3305ad594516d69cb38f45e1714d9bcb552d52ce64b6e6160b5efbf8688a14a768449e044e24dad3b91d7f0bbd4af699ac49005bd2e8d15a0a03bcbea82c627c752e6e0ed385e4ccc08fe9371d04e626b3406b3e3e6252fb9953d409833c60558ce62fc5c6dc5f5bfec0e0bb54b149264deb669503383ad10d11d06e23e580559a0933378f213f3c1b4c71a8b99191a81be3dcb9d3c33d48ceae82abfc25771bbd0b4f360bf57ec8e1d99711295a54eb23b9cce5460edf9c4553be110c437aefba7cddca491a73d83630e66ba55315906ebc1a32092064938a4 - -OutputLen = 256 -Secret = 02b0709af4b6bc98f236ec7bb09d4f4a1e02c3128e4bb64bb087d3bcd204decc912f29543e137b4669a979b6e8ef85c0bed5fb6f2d84a7586cab6a03092200fa -Salt = d9c05ef37e7e7cc08fb1dbf368d4ad9dd54aa00635c4c7869a92e54eccb4e19eb0d6684e95c8118943a7b7d69bad195d1f1ec91e38b6819535fe5143ededa363a4b2d4259da4d2928028e8ab93f413431b9745e1e041b4bbf377205ce5713bed3179ff471d290ec5d6efc8fd8142152c38c17c -Output = 8fb30036abbf20785034bd49de3aeb425f27e202fb8c9a89e3eb4751837c48a1a668ac4887ccd317b7b593ff86a1f52eb5aecc3bd6fde4f6ff4b44aa65695e28fbf9da1088df7c12542236a0bd8a8e41b5a19f0b837b8c1197522b78bd65607fb212223406220cec8c5b1df0e21a0848fa2a36c6fed8674dd039673ea0f77908325947ccc0078806a8d5637db71b0d8e442276c7388f15c128f4b5c9fa13826f49bb5e1b7c6619e1a8317dd519e6e7d4e5daff3c2b2e733d960ddba707757ee4e94212416c5faf836bba3487e94c2d8778f1961f7931bda6f9eadae1941ddb39c8f1df2c850d28a434f3e3a6aa3215dc18e00e4d3f8c95be51ef1127b60ab419 - -OutputLen = 70 -Secret = 4eb6217d002b9ceaa50dd482ec87a78dffd7aa3ce5c90a91ee0faf88ac50f34a6f51cb6ba72b2ed501714d9d81a80d7ff8a4099d1ddcd1d43bc31081642b0c31 -Salt = c7b5f1326dac50fe11fa52c908953db75bf8034bc8a112f29aaf95922126580abcfe36496d874ab4933f3753c69222b2e3f3e28b1bf3409d2746e454bc452ef90d4e3226bc3111c0b53303758aa0a6dcf4d00eaf0c431798245d2072ee77a540ecb9d0f96adc475a6029ed7712aefbdff2513f -Output = 141bb25020e050f12f4ee8a5666edbf61bab160946f364470d2106ef539116549c29decaf54b881a7e8a09bd3a31a42fe6f7a682b13476dff52e8e1515ef126345dcbc13c0a4 - -OutputLen = 70 -Secret = 21166717dff8f5fa754174f9bc03f90208d5138b0ad5434f8425fee90a4cf9691d3f514ba598ac42c116f565fbc43bbc50ac8e531e4fb0f03014e8cada7191b4 -Salt = 354302759e8980355059460225d619bb238e60bf43316b3f068344eb39f05f6eaeb0f9490580a3f1ec20e4ba892f93b03b1d82f239de7631058053446f481e43054c30b6519fab2ff44f8cd62377e48567ec4e81b58826eea26187c052649611283bc25a20f30e8b5c0533245b1b0923ce13d4 -Output = dc1275cce16a130c85a3981862d16fa279c59f65f3f4bc2443ed2873926672aacc9f6000f064e439154208feda4d0121a9b8b8cc66c2430c049955b01b9aa40a8c5cd9d3eb82 - -OutputLen = 70 -Secret = 33998c9380f83acfc9e491ef0cd0e2c9ae4b3a6fb032da0436e1aa6832ae12dcbe35be8dcf396ef77362ce525c4089c3a9e9e8ef99ad9939f7e5d4b7669cc309 -Salt = 14ffab9e344d355011ed4f1c1cbec0e9cdeb3c2b0a681c7f37dda72a37e1c6b5679105e21063bcb78e1ab18fb29675fd289652b2712feffbf600da445dde902e24de8941cfc279b012f5bb90586c4042fcf19ebb8d56fe93956aad6df981c9a8b84f17c83797e039e48a6a6abbcbb016be963e -Output = 6c2d4ead0eac3cd7382dfd81bd347ba3ad22bb1558ede54e072777cafc2704983ce77959281ff8777e540ac4a246092e09c74726fe61cdd8fa29d9f975f1bc3ef331a89b7a7a - -OutputLen = 70 -Secret = 7b1887b800d3e1953676741587e044a5327f4f40da5ad61cec37ff407b588da7f037a0ca9354cb6bf9fb51202307b05719e736d75098a5f5c19c7a0bb411c78f -Salt = 32add75ea06f166dce4f10bbdd87604c0313c02e4044f71be773c2180ca202eadcfde32037d5497b120932cd5b0731e2d6b9cd821ddd4c34fd3208182b106118dd0f56ab8f89e565176094fd93e3c4c1ea35e6f0526016327b70db64f1a747e08492f8521565ae4ec3d63f599ca8afa3bd79db -Output = 46b6a5cf5b60cd57349b3cc86615e00d9ef209b1179e45d45706c84aca93a23859d50eb3d6f0802741e89ea0c8c6d98e33a0f71bb5bcf55af1ffcf75c18ef0089967d74e218e - -OutputLen = 70 -Secret = 01fc8d251807995f01924f0de582f966279626e4abb2a286cc3f2d939b692df34ca0af6d66e51f6fc9c74e62f0804768401b263ea794f235d7e68344a66edd44 -Salt = 42025a3be20bda9b893c753220f6aae03f9331e1895c64f878c797855203fad77eacd8bbf6a2bbcd88cf064f2da95b46be0ad3893048e2062c67d0cad6f5a3f5a84332f6a5c2fe903cabe69443eb04be31d27a0b973e9b9e841e15991a2d18633f1343c5204affb39f7422e9f1f956533e5131 -Output = e7ff81fff44d0c61b48baca9ae9717ec2d936054404c787beff1e0ade5c134410393bb933f79b8a7185dfab93f163456a6e96238724db0ae86a2727bb0ed8c78677b453036a8 - -OutputLen = 70 -Secret = 3185ed9e76d0b94107a90779dff94d2f4b20637e11322fa4f6979d21b75f465b44f2d96efe66ea8130fa2d310bd0968ec7d4e95c740eeee0c24073edca17eafd -Salt = 625654ea949bea5527d8a56423ed99bd171f823ff79e049e7d8ba61291a89033062d1f04d275247d32332d105d54a32f2a08ab095f80a97deb1b86be7cffb0834caacdef4fa1475c932c8f94549f7e1e573d35a16e9d2381e6744284aefa12278a4323f571bee6a0b251f5bf2cbe879b9abc42 -Output = 31512877d5be51f0e11da5d4a616ef5b1cb5f409444a08e54e5a6594b9a06d8e4263ddd549d4c708cfd102b4763aab1a18ce788cd8d8c0bce19c23071319e539f499cb845805 - -OutputLen = 70 -Secret = da6ce710b731833df3f0ec51c86de964267a88b890007c864c75f2059a2d847016baea31f6f5922a9dfcab23e792358ea9132e96e2131eb3ebb4c8fbb93c6f5f -Salt = 44294dc41019ad6f3ba96ab324bb5608180b38722a18e0e4c7097b6b885f822c00adaf300add76b6f1f6e070f33f058da02bda4304a2c6d03f134194d7b84c6a6d65302793d8822d8c8da7b3772fc39cf4a542b47023440d874c2d9a80e2a5500a5903c839a67b76b7bb1641bbf3a34cd5277b -Output = bfcfe4f8baa74050a50e161caa4c3624db4387d9e551d15fc7046be2dd0206d515a287b65d183903144bf643d08258f83935b6b6eb9e1bdb753b5b72e730662379dd0c165fec - -OutputLen = 70 -Secret = 4cde8451ba12f24c0b07df49bf93641f9fdd9f55d8f999efd8e0827b9d8ebad177d156f909b8ef607a4fb4827506b742deea571e5cc2ceec57cbb4d5cdff0a18 -Salt = ad7e1590284795da1102b398758e14ac23ec4f2c620e1f5724dd824978f742f98b1755d159d2854af651ab459cbe269c832da1e39a2af0c5416319b2ea4e9010da9069f3e89fd868da81a1c5fd7427cddafe0eb7d6ce33c1244880f7c9ec564bacc6bc52d52888408b06712e0099623dae7477 -Output = af9f301aa16b956d709e68fa868719342ed5e137e8d66c6bddb574570e0a35dadd64f9e872aa159f13401c16fae086faaaeee4ea0c4bc98f839b4915fb70edd4e4b3b3971f81 - -OutputLen = 70 -Secret = e0b35db3c5f1d2b77ee5c2b07c017fdcd42b1d082232c197185920740a238daf811e29f39eee8994f6cbabc1ab2e39885deee80a626ee1cd540c6f6160bdbce1 -Salt = e65a7a6f1f0876cfc42b6d4881ca42298cc84cf206c21010add37e93712e06a6356da8c58b0e65d81a35b0a6a0924729fadf9138a222af54e8c2feac52eab73017ea6bcf530afae6369880f5b9bb8feb978217399a2c38c091964d27d37fa1b981f2e94d749cdc065c78b4b087dbe84179a973 -Output = 89ee8aaa07237f9c590550174fe6ee06b2979ed2edb30ed13bd0c47a47224a2062511960c10a6c2c8f112344c75d504e004daf224a60812d240241188d23b1e0dbb285c31d7c - -OutputLen = 70 -Secret = 3e6429f39719a2a1e0ef20145e975df33667ef310d826f8df0180596b5143256fc40aefa667da76238e33e2ec0062ba5a6f6d4d1e6134aa81bd6c7cff9fcf161 -Salt = a38128c7a4994e0fe5dbf889de2347724060874f1efed7677f443ad0aa47a855d954aac1d612421e3c49e64fe6c04cd9d4c0a17774e27bf288774f1f5672800613768896a07d4624db2b919ef9f4a7e6ee2c01fe4e4ae222180ec4149268c1b54b5b10ebd5761e4db6c30a36d8b0b02c9cb3ca -Output = 137dfddc9fe6ee4d79afcea66da2deb5e7cb9306b4b749acdbe8b065cdf9da2567dc271fd787658a93af3448a661a5ead1bebddcca41026ab38f0fb39e1dde82a126100b4526 - -OutputLen = 300 -Secret = 610feb5030981307372680d23d59546034a5781531eeca09e593b830cbfd8a1fcf68a58fd27eab0a55da27e96d4e73befb9a215cb5c32018c1b0d937701ab786 -Salt = 616f5d182c5963cb93d597591cce127e2084433acab4d9c58af656ddc7230018069726da754ddd309a37efb92b957ab79ba320485b0098e04977dbb39f8ec60e7c6476c5fe61a4c6164a86ffbcf4b33b8927f286c267165ad69b74e03998d4e4684c7aa2fcfdd808dad2e873a4cac4ca503f6b -Output = 0198917df93762e364034fd14e2cab0724aaeedb9fb3361c2da9537cc3c471d1ad23fcb3d78a3605c40ff731ad18a4b32e6712154159651ed97936764bf53a4fde3ccb75c93dbf0d3b069a1138e0cef77c27583abc5e6ea9cc9d366cbc05f51c4c9ed14dba8b8cfe72e9c6f09dee1ba6ee91a4920982819edba6ccd9ffffd06ea4db3f5873a1be06211e365c174a156742ddc2fe55cc9cbae249f7733bd0761a19b98fdffb41630a60827fdba2b047709ec9af1add200835ad8e45236e4c452b33b1140de38c56c2bc95ce98437fc53a6339eba0626b1b13e5ae324261cd36a5762697ff5861e79e77fed88544190bff68ff01b9e96d0cce8eeb60792963b2806367ffc523a7d1ce32ac24640555fe27623b5cc242992fe246471ebeff12fb811e5208b67d73466726eed5a5 - -OutputLen = 300 -Secret = c72210d41da38649170701d10979d418a3a572a8c68e447877d9825de907e8fee42c5ad6da487e3c027ab128bc0e36f38a5944ca25a82ef3f26eac2b7e865519 -Salt = ce5fbb3e302cea913d5c00122a0011f51426609fff8f3f38e9210ad866f00b314089c52fa873e3bc3f43ad15de9cfd4b321a7e7b79ece9bf32c9c727d7cc28efef0efb6fe1118c09837b5d8cb76dc29e9e22a54b3eeb75aa803d364b16290e8bf085abea561a8fe4da9f199a881c7e5b229d01 -Output = 410217f3304e39ba855d9f05f104ef2681aaedf77727515e6f5b92f776cde34c449ca5ae6344936eca05e433d3df201394f5984dfc3ef4d0fa94b86d67ec6216af9feef4565941bf0832018ac625e0e7548c3d57419a0d9b9196b7088b259e93ae495647297d5a7ca627b25eae49086665cf0561204e8b6692221059bd57046f45b75f78f252b67c6938623bce4cba50f498f7d725667d6de1f091afd6866c796217b3f667806ad061ecad72ce264c4ac26ade453e414445af97cca7eaae6df1570804e421c0ac9569db3e96692eb47c7dda388c9581f851c3f36774d6831226420752d6e707f921883288f03c2290e25482105938de3d9dcf613ba3ff9549101359e03065c1af7336038796de168391426635c339bd4879b0df4be90e78cb8f529df6a6775a061da3309b6b - -OutputLen = 300 -Secret = 389e6e6a7e9429402956274d02fe7b55c2ec0675651644716b9a75d09adb4e405c0477a04cd7845d98a8d5ab6f3e97b3cd2c216dc2fa1ba634f5028affa6fa96 -Salt = dbd46d1d97b31db5d2f06fde2c9a999104fdc234b784f71a4c0ed7a7940d4750fee6a40e951ff327a32808fde122a9ca8b6cc4d4075c555e903e54bcc2af551b87881656b0d69185f11e8150df3ac46a52e966f47b3531381f769faa98f442a867f685ac7eabf475f072acf8730f8e8917f54f -Output = 7d8680457ca046ea0c2b6d78256f76990b142a7a10ae201f750116e9fb0c75f5ad6637a933607ca28acf7e00c019e4c58acdb56a1865308ef76acb80d4aceb593beae0091d1fb1e84e67cc9e07fa9a5dc72e205ceaaf804ef2c38354d4860764e230950f34cdbf38bb6bfa66db9b89395448bc6aa7c260997bf8d706c08affec971d76dcf3e02c24c6f6cbc0b59b1f11e16230f844802abd4e51336c4cd1dce3f070d10c97bb77c8d15bd76b2051999c15f0630cad87b536869706fc5d2488855fbb5e32bf1eb4b072fc9a00814517cf4e552e28c4ade824503f22bd86e676d7affa88c14bbcb0687a000b1b15c0e7fb8d884d5c9224abfe5bed750b35c0de774ca60c72fcf1122cbfbcb19554af2e8f7a4c73ecf3966357cf2786b36b728ceb676011f179e3ba05dff9db13 - -OutputLen = 300 -Secret = 1c578a7f0b937d2f379d3e90a390afb0e173badea803ed73c13358ee4225c062ebcc828b8fbbd9afd7cf88e7a025042979b46927636009be6e0804a7b1448999 -Salt = 022bc72141fa409034e01ec6baf04dccef4d681225f1eb79421fa2548890d36aaaa37459d7619f61afa38c85ca244f79a35ddccc8dfb22eb36bab5b782e66eab24760f38e88403d0ae5250468934f98b0bb5e44697d2a17c336d6aa76edc9fb07ffc8c0ec4b4f61e6add7df4ff3e883edf8c24 -Output = 8b4b88621ee68b462293e768641b6f28b7c934aa3f1b7f6b0981b37c1704a9adf25eeb1030c64fb9c9d109d2e51f522af68e15bea5d901e0bc45c4c57ce69df52c0218737ed652597c20280058c7ceba2f0b3e68785d47f9a7c1b9a9cb50854265f1fa49fc4c61329512329f55209a851b297ac0dad9779258e89a030317e3b9e5022d439c038824da69094159b6de40d361850ad7f60d1651bd3c846c89ca96f18390b5aba2bbe25d5fc5b1dbc8f6c756f81c07b39da994588930b995cb081e1597836196e049656e270fd39c896de73457e29384cf701dfc2c4d419931f56b44c6f57730b62399c3d6079c9365a31e196b24971c6f1bc3ec9c4ff2aeb810d4176b3821ab33906b718cf131bbb5945f70875235ad7a451e03103b8d74081d9687688567956ba1dcd12f469d - -OutputLen = 300 -Secret = 8fd4b8213034843538265ec090ce9bdf07bffdefe6d8e6e4f2a4fb6760bd1aaa287d91c471618df01f620339d069abfcd198e3b7b6ac02912907441007a616f2 -Salt = 12758b333d1374dff584427d88df860d9161463ac260502a997bf067f4d819a206787ffe158e83d2724d50259e655b81a8564ea1fdb23d9cb7f49171fcf61a03786602424d41be7c702c07d798db5cb1503dfdcdedaf99a2275040049f2985e3eb41772af3522f49405a676b8f0bc74834351e -Output = aa90981c54bb3e24b742628b666e84a922d62ec57960c3361c41fb47164458613e2eb77b4e12d9979f925eef7122086bdafdb89805fa5af3b9cf95cab12d28297d762542a4032279164be2d843197e110ce56f833f57c19d229ae87133720be10baf6adc7b01457cdba98e1f77b1b9ceabdb91723e650cfefc8587bb7fde8598c2aee5db94692e7100a1b7c5d350c2217cd72f47f40db56a14ddfd8657b3ddeb4a3f0c16c1e9251eeae2d94374657079d8830718713714184959c4c9d825c6d4da52a931a28909ad14c953507d53d138a26d90019926e1d42981e929e079e73518bb3baa6df8cdd12e73001ca4fd7933e8e07e2aaf47ed4ce5acb5d8ba87589ff1634fbe9d40885cb2298aa2bfc07b731d360dea6d3ac35d2ba648ca30f3a899d0596befdd71d61f96af879d - -OutputLen = 300 -Secret = bc099f309d753f2ee5633deb57d021f1553a8847383f5ac0bf6157c18617997192b8bb82f49a3919a1b07cb88219c449afe79d1d535673a28a8ffe7e04aa9ef7 -Salt = b41a972c3e714b85b78006acb91c76ddf78065f22715430404e422a86c44eaecda1480f19fb4c89022e5c556e7a5e741870ef0e9e7bdb31250d2e7950b49012368a09324ee95dfbd8d9a979e225245ef421511fb50e27a6ffafe289d68b3c36fb6d68a2833f027f825401b14bc77545115361a -Output = 21d81071ff1ba04ec6c6f8e40cf08b7eae8653620685835045ed5ae7b25fbfb5332d57c4ab09c8614e21526b7dc220ae26901662d99a2a65abd268fd68f46b4d23ff58067d8af7bbbdb7a1fc3cd5549426d6ca34b621e6590aaab72db9cd2a0c888f3351a1ef334ae5b1d596f4e024381adb7e3bd3a6d3626493725980b8ec8b4ad9e4bf4f18344910e1049333087289d16743316ea4eb58ef015cb20242b4d83a767a00d5870625ca32e745ccfcc1d76c21c66843e85d5e5dce2a59cbed9a320e1ab331b5516cc265ded7aa485cc5d08743a6025442f8b33da80b802a2b10f1e770e626460a168339aeded12cf090a81c96b70b5dae6e03caf4b328f412a3bbc4001421c63fddd3e0fbfe36c2d3f4f447519295c7b592896dbf753b39507daa4660a11f2b816d8ad773f21e - -OutputLen = 300 -Secret = 385c2160918cf1b63f644cba7d2858fffd34e5581bf0038336bfa625204c4b73e7d79d0cdd40b4219910c3278f5b760e90d58251db9e233db53246aa359b91c2 -Salt = af05e1b5ed52cd686404937cd42042855942e0385f7a0da7fcae8f26aaf82868f3664300c7094656fd5588b0fe4c4e312019c78058a9904646827b1b69bb0826a0d640dcd6d00e1d580bdc0aeb24af6afd1c68a9b53f08035835932410698b5e7d60925cac5a55a6bde3d9b9dc650fae1781a8 -Output = 34398f04f67862e4b0f530ff67b3be31a5a60d8baf48de282e7243ef728d04d648f65d379e0523d9402c19ba93381e0389df9ba3968e66076c85b9103ddbf343f102e9e85b39cb38fe05dc1fa382097e81b72695e11a5ad45399ccffb2b4396d3dad35a86e1a016bda8a15fbccb2dcdbd2b364dd189d8f6522c7024d7a0bf49e721f392660b749456c459acd459ed15002a5dbca74627d532cb9977c9f71ba3793a28eac32bb6e53e8d5d41fd17312bcaf96c213fdc744bc5bc69bb262a4a230a1ccf4a5e6c86a51d5b33e3058e35eabddc2d1e94aaedd9fbcef5098cf98bcfd81951a87fbc65ba9504e1370a89d2d9fa813bb86e455597a33e54088d4180d61057258576338a334a2197fab24617f99385513fed247619cae7197359cbe97d74a94e26c7a974f860c1de2a2 - -OutputLen = 300 -Secret = 9a6eb189d23eedf0a97b4c1095b6101e43f1055df989c71cfacc01429a5aa2723f9ef17f1d1f4372a499565dc90661a411fba242c2362faad38a88309654ed61 -Salt = 12d2496fa61853e7424cf8c701dcf2c56663e70d05011e5dec7cd6ed9717183f7de1670811fa9a79d318362ce69b099027a6363f4496be7b933d065d8542ffb87370793bceff58169cbd4770af88cdc0afd9c3a5a5d1081decc1fba88f747dfd19ff41bbaaf99c6d5a90c6acc4e8c46b74ce60 -Output = ad1bcc65d6b60d4cec953ec2ac93adcca193e9e30cbffb5e3c8a3f12b1ee2be0f90b55fd080798dda85c806853df7cbdfe681e289e72152b062654b9d440dac4f3c359431a7450bbf5a35991239eac9f097f56907df158eb5fadf4a63bcfc273b14e8678d60cb46bb1feb418137613969db9bc83c0ed19ce75376ed66c77a9096e3cf0dd3af2d48b52c5b72f1e3b6b83fd6b51344e5e051a5a8c9a32af3b91581878831c6875330bf602bec63fbdf76e7be1ec888b8c84d8455bb7b58243e8a1fbbb38b69a56ea248d779e5557309b02a39ecfb787e08ada5739a4de23693b80319052d3365abaf75b90c8b8b2d7a4a230291aef48359ab0b33b7d7b2cac5cc58d4914476ad3e75cbade650f7fdb3697750b470b6cebfe6ff6d8c38eeb935a09247ad023eb635afdb399da08 - -OutputLen = 300 -Secret = 5d6bec2cea9a22f3c45d8fb40c8b63c2f832cd379fafca84cddbcac930d8034048697ca192ae24bdc4720f7a31d1ca7e69322f819e422c830f48c83e506dbfb8 -Salt = 9ae0e8259157fdbdc1958ac4e12e1b7cf41f52ef151eaa49dabe5bf2a3ea2d37c2d827384d6f5bea7e032939ddeff4bd74d9076299a4075129eab5871ac824912862c08288fe156ed98479ce37b996c87329fa799730ec8b84f729c40d5aa749d56e1af0c81a7884d59a07060ca1bc9d4616a2 -Output = dec9be945a486865ff3d8f670b31dfd0d91d36dd684b10c7d8ec8f0fc480a69a8ccf1abd7c38636eb898ed86521e172b6ba26e897280549931c2b9503488bcd86688b781b591e617c9c3a383aacf23b2e2b709d4c8ae1135304954209f84a16f8cfbaaff1d10fa98e5db3de8d61dadf93f6acf166cb4cd3c673a68e78d66e8d5f6ce4c7249ef0c9ae6740c9f80902ca294f6b3ce3f89532c00c0ea4ef2540037efec3d0d580b92f5423f1cd2c1c0f116b58b1f0fb3267d8d01bc1631ff2f10706690fa58e2c9cd38310290436c33f354f32ca74411538e94aa222b3123508097b69fd353125d2dfe6699c7f5bd21aa49d94cd4af7eb2fe77397fdb6cd9229788fe23f8932a458c5eaefe88f0c131aec98dd8d30d0c19a7e9ae9878034ddea79c304851ceeae13052b27d9306 - -OutputLen = 300 -Secret = aff11ef5aa2f5ef6a541e69474c993dd17609a2a72d7fac4c3621ced73e7caf7d9c6c1e158d2d5cf076f0b51008731bfaedb3f713d4da96cecfb5e4e522501dc -Salt = dce08d9b0b751313ba85967cb67d1e5526d9db0161f6901378d03f205439a036e2d6a07d5ea52d5d9ef4bf17a273ea6eb8f7ad24d2191e63272d80d5b0a47d41d590fc1fe880b0b128b9c14eec0bb79955fc1df920fcee4db3c45c7b1c46b4880f8f5875cf63222be6d1ec45ad2568144b8764 -Output = 51676991d69523f2039f39ddc7c7311a2a6d03197fdb66f1fd25f85f028c6e7332c69c46bf19359442fccc0cc25249a9928429c1f9af021886c39febff62484d88650304cae3519e6335f7fbecda6436b7bbe436d005eaeb151d32cb9bbbbc748fae1e17f514ae9d0924fec573c3ae90de609d1ca8c2e3bdff59be75648a2bcd87d068d1a9924d8bd07a546c1eb986db01818437b18431a6522a59846a50df83037a50ff35d91cccde6fe533d936c61f8646a2cd13a609a6eb8d7bd3eb20f1fa3b141bbcfe7e28181d971491800737b13783d5fb953e673964e58b29a8a40b8bd4b448421aed436ca8039f528751f63a327f06a2295a01a84041a974c6875a2811775501f5b16dbe18d35c5ecc619a62bd35e8e5f6d2431b395cdb147cba60462320d873b38a00952d583346 diff --git a/src/tests/data/kdf/sp800_108_pipe.vec b/src/tests/data/kdf/sp800_108_pipe.vec index 3a49ee68b..cf9f1e60f 100644 --- a/src/tests/data/kdf/sp800_108_pipe.vec +++ b/src/tests/data/kdf/sp800_108_pipe.vec @@ -1,1808 +1,1456 @@ +[SP800-108-Pipeline(SHA-1)] +OutputLen = 2 +Salt = B65A30885B0849C7099B +Secret = 63CB90F9CD34B95007277AE6FC17FB45A9248725 +Label = FD7DBFDD60FED4CADA6DB78A +Output = 4B0D + +OutputLen = 2 +Salt = 644E398DF79D9477A706 +Secret = 954418FCD0EA5B6800D99B5502AFC98FF7E9302D +Label = F441EBB9D176AFC02CA826C6 +Output = 17F5 + +OutputLen = 2 +Salt = 6303AD8D6F85B06A8133 +Secret = 486DEE7BF8590AD8146F4419131A8ED35FB67407 +Label = 1E1A50A04838FD3D15DE70ED +Output = 096F + +OutputLen = 4 +Salt = F83E603F89642D588C6FB9E8C8149DC7EE8C2697 +Secret = BDA9E80BC702E527206ABEEAD5AD0FA9615578DA +Label = 5114C31AC71149514C87F540 +Output = 9B1C6672 + +OutputLen = 4 +Salt = 35D355DE2A4ECB451BF7CB3125379936A37432D7 +Secret = 483D123AEAD1F1BDF9041A030603B8432F0FC795 +Label = D5886AB422F85456704F73EF +Output = D820C666 + +OutputLen = 4 +Salt = 4B1AA202208F62A09B81631A5A4D5D03D6A073AC +Secret = A56DF8BDE95B1F61019B9F191A815E3C7E18AC92 +Label = F053DDBB1AA66D25B241FE51 +Output = A3299705 + +OutputLen = 6 +Salt = 5AA081F74B0CA42BAE02876987FD288AA8ACBF4E6904F05AD5C42039A08F +Secret = CFB5C300A7C47773BCEEB0FA971AABD9AA1E0420 +Label = 2BF55EC12AF4CDB48A38D89C +Output = B8E3A091BC54 + +OutputLen = 6 +Salt = 686E573FB28A6EF66BD4A5E337668FB120D397F3A3C71B425A7085AACE7D +Secret = CE6409FC805759966BCE76F3B5EC1335A500BF42 +Label = 8503E552DC474F3D2E957472 +Output = 979F437B7DCE + +OutputLen = 6 +Salt = 903192A557566F518479E18E5DC37421F9D1A89077309422095C6DE74A08 +Secret = BC79C2F0B1A414D54AAB32AF397A303F7005336B +Label = 61DDCD43EDDB5718B22BBF4F +Output = 080EF359C09F + +OutputLen = 8 +Salt = 8D2158258B2B786392DC171678132E21C7AAD3957B90EC3C786D7F27E9D1FB2B59C8454FC3494C6D +Secret = 632EF388D56D4D73B96DA0507A167D4B2FA7A3FD +Label = C853B22834014960BF36CBA9 +Output = EE7FE931F1E09CF8 + +OutputLen = 8 +Salt = 83881C042A217E30E8EA91EF612B2FCE40990A8B64F208714A9E58DB65E0EDB03B1CA4F7AD594DA1 +Secret = FF4188131F4F5C4400CFEAFEBD3277EC2BCB96DB +Label = 5BC7020F1D84D52ACEDBD444 +Output = 49ECFBF85C039D46 + +OutputLen = 8 +Salt = 74157D2B43E957235D679D28686B64999E0B3A0CF4A058A833310D4888F2F800B2BDA7B5460C1E67 +Secret = 09CEBE9B6041FA90A82DF24258A322B1C6CAE133 +Label = 968DA3AEC9E461B6583E428F +Output = 8DAD9CA8EF0B2B87 + +OutputLen = 10 +Salt = 95C9141A7445CBBC6A6EDFD9CE191F33E34BCBCFA3001F0872E1317728AC1BB20660470A9CA0301C665C0E3403C993706440 +Secret = 34522A42FC23DDB4EFC05A38A8FE27C59957BB28 +Label = 6F47468E1BB9EE3606CEF5D7 +Output = 1310B397D09441AC1E38 + +OutputLen = 10 +Salt = 2A1D624E4926E7C908682E71AD3B97549C226F19848852A2F52E71F5707D18F24F5D7E5401CE9DCCEECD51EE66D4037D6466 +Secret = E18E59F203D78717568E68981DFF6F415909E9FA +Label = 6977773B87E1398CFD911510 +Output = 02DA6910B3D3B25C4444 + +OutputLen = 10 +Salt = 49B5F05CBD7B70DE9EBEE7A6CCD0CA593C7EDA9908378752B8DF8BE55C1C7D93A942080E728992CC6EF30982B4F89AAE5077 +Secret = 824A746131D9842E4B76C1322EC942838397F151 +Label = 1E8D2429211E53ADE422F98D +Output = D6FDF71DA070FC878977 + +OutputLen = 12 +Salt = 9B638617ACB7137EDB40DF6BD286AB2DBC768908917F49E5787FEF9837AAFEC96E7539E3BC076AB0E1CD756DADF4B6E10DD1D4E2629591A3848C1A1C +Secret = 61262C8C205839B94A6A7DB052D3A0C487836E51 +Label = 70630A15709B1F247D7084C6 +Output = 9A6079B6E8B2879F8F0B0299 + +OutputLen = 12 +Salt = 8FD2F2DC671C57869F7A1309403EB7E308E3E08A8E649FDCE881F33B97A130E842F845A569DD2D27F240C8BD4C045D1ACC1BCBB53C9BD3EAC176D55C +Secret = 9B7275C8C7E17D575650D08AB590E2DB0A786AA5 +Label = 1998ACA6E06447E3221CF208 +Output = A7FAB00DD3E4CCA67BFE14AD + +OutputLen = 12 +Salt = E24A9DC4E1E7FBC39634CBD9F0A3F818F16CBC1D1368D02E61E2611D152CE310887E2BBB3FF60E9342572606652035C7A017CEEAC09FCF187E3A26D1 +Secret = 4A9D01A06C779EA4DD7242ACFD92BFAB3E8DFCE9 +Label = 789C9D5046167BB2E2D90AE8 +Output = DCEC761AB0C83DA25452A873 + +OutputLen = 14 +Salt = 5F8F6C0147A4A5703B2885E16B172E2DBD57735EA452CE8D241493A2AE7E49BEEE05CB0E9A6C7725F2BE6912C519BE14B8CCC52920566A21F0C0BCD8C9CBFA3CBC7403807460 +Secret = 8EEAD7041D2D1793C29EEABC699E3F562F61D5E3 +Label = 7B012137D41496C6FB5A5583 +Output = 60F307411E0D430A28C22EBA2980 + +OutputLen = 14 +Salt = FB9029F976A29B569E5F5480B0F83F2D4FAA60373C11D5F08D5529F7A2316FF91F0E80FEF4D01060EBC950F63EDEF804E44884BC4AB82EF3C9EA9B51F1267E52C6FAE07420B2 +Secret = FFF26CED4495D23E2B1852C9865EA624AA2FAC7A +Label = 27DB0BC123BFBA6A0020306C +Output = AEDEE54F650316C0540B6E80EB00 + +OutputLen = 14 +Salt = B9E29A7C1129B7DB7FCA7170E28B36959EC808A99B0EA85A69BA4B20D21E0537173F61B0191D203B23E6BF42FF79046CF14A873C1A468E75A13EFF0E4E4CA45F1A7519DC22A3 +Secret = 1095CD4ED29B5ADDDD2BFCBF159A16BD83718EA5 +Label = E872E897AD5387481AF92A29 +Output = F5763B0D2D2209E962E8AD7D2BEF + +OutputLen = 16 +Salt = 54E3B1B885D30A18CAEEE9A3429495C427DB0B543B695CA8F11037113EE0F5AF075275F61D22B9303612427F41B476143D38A0F9D2FC6AAB73B0219AEB0F7DD7E5172C9E5713F344A7401516E8F00D96 +Secret = C233478B521859560C06AE2AD2A01FC084039E87 +Label = 76A04AE1552F8BA105C03F52 +Output = 470C6B7F790464F4E1B13B6681A48E00 + +OutputLen = 16 +Salt = 8B80A382D1AE995EA4BD45BE1058AF1DE60F792E87E85B8FF2A7460043F82E8CDF1BFEAAF4BAB6142C167907F8EFA3CE61FE53A67BD46ACA82CC62EFFC7AA31B48D3B401C8AA6BB20C52999EA9CEEFF8 +Secret = EF00A76A499C16E27184714B6697772D2CFD87A3 +Label = 0737479AA0BBF2FB6A606851 +Output = 7D0266C4DB768A10E414A7D23C98A3D4 + +OutputLen = 16 +Salt = 4BADF745C55BCF8D1C63BB099B447FA57499F66B138F68AF334AACB641F35A2CEB72230AD92B618C1E1BB5847CBB55E5C314024AECF171DBD1CD3AB0DEF3E14258CF3F6C562616724865AADFA668F7E7 +Secret = C66CBC95B52D60051195FE37D4C57F9DD7AC0474 +Label = C40ABD88794D8579F6065234 +Output = AFB52A7FB5AE11B810CED05A64DF3778 + +OutputLen = 18 +Salt = FB1BCF34DD9AD4F764A3E523508D8BE30B8778B2FAB0EC6BB7509642811E8FBF0D19EDEF611DD974E94AC6CA4FF61F1B0C30CAA4B4F0EE6AD3DC48AF5DDA1E5AAAB6494BCEE5EEC0C16D0942E03A9ABCE6455A42015D5E1CFD75 +Secret = 35A41F3AE01C6A82854A9B851399D714FFAED7C3 +Label = 10D7E05575A3F12FFAE2FB1F +Output = 5E8AE48ACA1951DD0C8530CFED56FC91E5D0 + +OutputLen = 18 +Salt = ED869C149F415B873B281968754D21131F8130F155030482BE33315D1D5853B4D794D3EC78152B01783E2288EACC6C18B444E1F550BBD38C190B2F83953E0FD890DD96DCC4AC0A2B35B7A23689409F115A895B9B9F340EE0A7AF +Secret = D15069DEAF8512D424A1E90E3B99A1FFD6C30089 +Label = 290A591E7DDCA63BC908FF06 +Output = D08685F29A653E046EE81F019E7DC3478D26 + +OutputLen = 18 +Salt = 058C3FE66EA57D30DFAD28F53F9F437DFE581F208011B7DE12F09183838BD8E182BDD31A109466C92E72DD0A225B1B2C68F28E3F003F06723C89C4CAE48E32D6A6C9E2BE50A3882BFBC0F6317487A6C811D0000C8457610690B4 +Secret = 7DE4FBB2DC3E3C60099963D3EE85C3A45ED2A05D +Label = 3D55B230CC797F9E935D82B2 +Output = 3639233DE9C18C5165C2B2126E69EE869689 + +OutputLen = 20 +Salt = E97FF4ECBE1AF9B60F178B36C82A9DA13ECE72B4EAA7CBE6DAE081B51B6E5A0776DDD88252CD2EE81503A10D2679D97B3A647D885BDF529F22DC8DB7FCFD013F7A11A4FEB91A6F1611262BB4EE0F17C526CD606B2EB6BC2FCEF15E1D585CCBAE5807285A +Secret = E46A6B8AA59E92E64F066319962564F87AFF921A +Label = 2894F522FC3244125E79FDA2 +Output = 9334C17D345653ED331E714A17184AC75D9B9908 + +OutputLen = 20 +Salt = 783C6E1621748BA88E22D3DE003FFBB4FFCD070FC0B8DED7984F7C5921F1E10031E6610E2F3F3B22322CADBBB7EB2F40082C49BE30CF16B890E619D2BCE7A46E6A124AE5C71324CC44EA80864778D9FC2DFE757DA662DA4360FDA90DD5C5B94FB97EA554 +Secret = AE8A78177C0C2ED3E22A8C2E3A110496E4DCCDDC +Label = F36F114AAE722CFEF2861CEC +Output = 1285DA797B611DEBAF7B5C2116AB87B9BAEBB915 + +OutputLen = 20 +Salt = 1C6CB07E58B6E84230DD995020AD630D8E209CD004309C031D9C8DAC66FD28746C7AC16A986CC64D2CC9417BFF4BF1AEFA6EF1DDA428EE24B6BE52ECAA15F6C537195D1C19CA90078B8F52CD09D6E92BE9F4D23A7DD55B8DD97B5CE7FB241C674FEDCF0A +Secret = DA98844C4BA65754FDBAD415BC933E20104ACAC5 +Label = 262FD4B95A73CB24D554DBD2 +Output = EC87CC0BF9A726A0296B4BC9481AF900296CD058 + + +[SP800-108-Pipeline(SHA-256)] +OutputLen = 2 +Salt = 371FF6784237FC6F25B6 +Secret = 4AC9763574A4483C8074B191DCA5CEC35DE6876A0AA54A87C56EB243E25159CF +Label = 73D0B831421C59DC4F8CEA09 +Output = 289F + +OutputLen = 2 +Salt = 99DF36B2F63393F1530F +Secret = 267405BAE320404C7FEB20F0229744D44569714867B337D42CEECA6228F923D2 +Label = E76820D905283E766F379350 +Output = 5161 + +OutputLen = 2 +Salt = 9EDC3C36C833B1560590 +Secret = 747606CA19878BEAC842D595FB9F2F7E41A28C3FE30583F5EA6E70E956CBC039 +Label = EBBE0B58ABA5DD8DE4BA2126 +Output = 1DC4 + +OutputLen = 4 +Salt = 58D78D7BBE6376E031FD1326D9329B508BA0D63B +Secret = 8737F4D4A73482367675ED3F9F90349B155A41B6F1A6431996F2F2894B2C388F +Label = 2357871CD5CC93F914D98EC0 +Output = E3D61FCC + +OutputLen = 4 +Salt = 03A28B94E4DFCA176B8B9DF806AE6D8503461A8D +Secret = 1754712CA4A4A4ADE0F2795016BA123D4307859C4A0E3B46DBBCE370D96366ED +Label = 33D2A74EAEC0CC8539C6DD14 +Output = 0360E848 + +OutputLen = 4 +Salt = 8F0D0D3A0EA17892853145B62BC813DEFF5953A2 +Secret = 3AA994DF37BD4696042171C49CE31DAC36782B15F6DC3A56B663EB48BCCDCF3A +Label = 7143A4E3E6D7664E9185552C +Output = 4C702A8B + +OutputLen = 6 +Salt = 0BF086E5D9D2A4EA075D3C85B8A3D9FDCAB3F6CDF9C371B536E53F03070F +Secret = F5CFDF5632E0FBC6EF584992A63B2FABF97D80E293F4BC4A1B53E8BBB65F9C7B +Label = D80822CD5054A75390E56679 +Output = B3B618BD03B6 + +OutputLen = 6 +Salt = A8E252155B853CE8D3C282FF685796CDF6A303BFCA49C9A2C08059BF5C5C +Secret = A9EADFEE978F311BA8792400FBA9E736DBD79F2061E80507586FD953ACDDD206 +Label = 345279B13381947FBCB4C29D +Output = 71D4FF2B5C88 + +OutputLen = 6 +Salt = A378BC9CD750E3A5DCE17FAF20D9C1179E03F4CD132360573CD661938C0A +Secret = 9F63B3441620F61BD9AE3C07784341006817ED39C6B66B2A4EC6BEB670E3F7A0 +Label = D90D167611B414D3DCC48645 +Output = EA67BF375350 + +OutputLen = 8 +Salt = 26C2D51B3A34BFDE154C890593AB9AD7F854E913DE4440D9188200070800291F0264400D26FE42B9 +Secret = 67D2A58C87792B201C6F47339258A0DEC3494E43B836B9727451CF88825D2472 +Label = 6761C49E63765E937F50461F +Output = 834E8259A91E11A7 + +OutputLen = 8 +Salt = 8636C477FC8FCBB16EAADC35D06887CA3DE51E0BFC23DD95CEBEE56491DCCE90BFCDA319B203E4C9 +Secret = 64701CC9974D17DC84D7440CB760D1E7C93FCF3B5B335DA82F545BC626DA0F82 +Label = 48D31818D10CD1C00DFE1AEB +Output = EB964E45EF24C5E7 + +OutputLen = 8 +Salt = B5199B1DC3A8018CA408FCBBDF606BD39EA43F236AC6BAD3144D6C2D293F3C41159EBABEC2CDFDDA +Secret = 99C8A03BB19D48A6452B5469ACCF85565D2F2F9DB1232E22CFE6E7E4CB48307F +Label = 2577BB07B2DD8BE7FAB92D4E +Output = 8E895324F98816D4 + +OutputLen = 10 +Salt = DA22CAE4D74D1461E54B006466ED106777C2A5B4F34CFB767D82FCD252C4914C617D44BC94A39E46646651639CA1B792B29A +Secret = D24C400C2A816388AFA3BA1EB7E3667C04DA13FFA062F00431F0FBCA5E8504E0 +Label = 020712C794593C66792BFCEC +Output = 8AE8F64F7CAE835B912F + +OutputLen = 10 +Salt = FC36CC0E211667B93144528D02E441995CA04D724C4C65DB9E2832482A82E5348EE62975467A519D5E94DBE2F5DC7AC2990A +Secret = A916B455A2CA984409E947D9B2B4C4625A91E6D21115196FE11480D2F894AF1E +Label = A4BF9F540DA137D27741B14B +Output = 5BF1CDCD4DECA2A077C3 + +OutputLen = 10 +Salt = F7334E486695E41196E553170DE4F4C03C8BA258A69BD86B99748F97828265B95AFF5DA8498E53BDE0600A4E4D670D08E7E4 +Secret = 336AC37B48E5EFA0AFF07791A322248731B58A700C0E1D8A5BF5639E950B27C1 +Label = 543FBD4A0A2D352F4ADA818C +Output = 35B3BD44E459EAFE97D4 + +OutputLen = 12 +Salt = A528C22DF70626B25F11EA9DAA41CD216C9916E233FE28896A74ABEC74E960CB90EB71ED0E124A9CFDBBDFAD978532F0240E9E508F607CE5B9B20535 +Secret = BA49F38D116D0780F2D5DE71E91202FD74EEAA263EC303C938023B38F46FF07F +Label = 729E9375BEB99CD7C85136A6 +Output = 560CB1E1B2839A6F3D75E70B + +OutputLen = 12 +Salt = 3206A0BB94CD7933354A9092CA265738EAB983B398C4D6E121E9A452FCB2144C5BED5F4ED98F79AEF77722491800FE389258B5EF59B2BAD27C78E898 +Secret = 7EA88A14BA06FD1D252BEBA934F89A59C9FD8F7879D950D5C215EC002C39F828 +Label = DFF4B7A7B74EA6B5EA314F1C +Output = 351F27A4F04BC315D63E13E0 + +OutputLen = 12 +Salt = FF76414A247F2A28E890902F923DB0598DF2596B18D808CAD68E1EB0088063A470E2D20C9F6C2734166607E80F678DF28B60E83D36F12D0BAA73F0B0 +Secret = 3DAF95F769C5BB8566C8FE45CC3F503F21E9B3DDB4DC3B694825DA46E7353633 +Label = 34B6DD62E984130C0BB66340 +Output = 8CB4F90BCB83A563C6C60A0F + +OutputLen = 14 +Salt = 50B05945CAFB93111F3FBE412C7B719FB3B1D750B7AC4A9373B78A733CAD2BD76BF73EF7DA4DF8CDD0704999FD301DD16C43FDEDB9AA5F10D09FB16AE5D2103B9EEBD9447554 +Secret = 2472024D887F7A71EDA6628D2607E0AC6C1B1E544B6E07BF08412984CE01480E +Label = D4D252556146BD01CF5EED68 +Output = 5F821EE1D7147AE44BB09DF888A1 + +OutputLen = 14 +Salt = D52E07E0B335C777EC81AC9B5659C1F13EDD32A0FC390B9CBA63199336F805614800B446FACFB6B01DB67EAED81707BBC45404ADA083CC6D206BA359A6D834039F7BB25123FB +Secret = 3E25CBF5C140BF5594AA5B811572BF1BAFD3051853275559566882B9958EEDB0 +Label = 9455083F1385310296FCBA71 +Output = 23DDA6112522BEF4707DC233C5B5 + +OutputLen = 14 +Salt = 19B13FCDCF3F741420B156321107297DF0C2A3A93C1E76681A0CEF4ED54719C1B9880EBBCA4A11DB9C3D713D7AB0C09685E9DE99E0CEB572B494C5AF7CE37B5CB15BDC8AE4DE +Secret = 95D78C509FD3EE5117E9D34EBDFC02B7308A1EBB62A48211A58711FB70368688 +Label = DF86FB479DAC31E0BC722CAB +Output = 45F306FFA42DAF549EEBAEBDABDC + +OutputLen = 16 +Salt = ABE98E6E1B1194574FB4F333AEADB4D2864D03572D0C408EE1B0F81257823910813C49EF288023D191179B003A4080227C13DCA4A9DB9E89F2BF28F44AA18469275FE6868778154206F4BFC0E8B07D5F +Secret = 7FC9191BB43AE0FFF35B93651C3A069729ACF5F2980E6E99ABDDFED190915538 +Label = 8F1EDA3E87ED39D0646FD586 +Output = 6D14BE2885F8B6CB98E95A56EBCFB3EA + +OutputLen = 16 +Salt = 96D90D515C514FFCFE9E8EF7F2292069EEB9D0F9AC0AF5087A2782F9317F64676DC55EDE051EF9B1C519F6FC2B64CCCC51CA880AB7FE5438360E46547D7161DF9464E0CC75D53BFADB46F392DF73996D +Secret = 9FA62BE9BD2EC2A835734A459281595996320D9F36302900E0627096E36AED54 +Label = 3396198C16941F094C9995AC +Output = DCBA100D6123E3831AA8D882F94C16E4 + +OutputLen = 16 +Salt = 8A74298819F95D8CD45F8663C5CF2F417AD6E4526972E6BCA662E8729C8E27B979D539168B0A84258967304500A9CE83B842B29C6B746B35A960650DF3F17648911F0D683543509DE9477D18581E050A +Secret = FD37B7091262EB55BB273E8C58E9A230055C426E38672BBABDA316CEA8AC0BB5 +Label = 77F03C663A7669625DE80981 +Output = 0F1EE8544394872E95D2EE6FF8C5062C + +OutputLen = 18 +Salt = 744C6256340D4CA3B211A60EF8D308AB419A84DBB8E7C0BB6F5987DEC65F032DECEF91B9ED909A853401A74F388B665FB2905723153583A221CF3F6159BE9DD245F93FBF5A1AEAFB993EA5A1DC3E53968D1E010EB164EB0AAEA0 +Secret = DB73BF49B81E882AB1C75EBB7811591BEAF4EDBC7DA3F6D9424B18338B5C4D07 +Label = EE88E0D224090DB78C11C478 +Output = E482FE17A959CB9217F55A61CF9D6A76966F + +OutputLen = 18 +Salt = CF9A03F27AFCDA1037FCCC3A62158082518DB65D74007146DCF2DA42DC5834C210E904CA6350F2DC52DDC7A8D76E4FD8A0EE5A8AF5AD505D292DEAF12BF01740243FF4B26A2E1841605C3941BDB774B51B17BB160A8F463304DD +Secret = D0D23A20D500EA2D1A93FB69EC42B6904366DF8BA76E68E0AC82D8B1002C651D +Label = D0A9FA2A6FE8F08A28B34A3F +Output = D270E76C91CF2759CE6A4BD828D84E006194 + +OutputLen = 18 +Salt = 6DE0754E7FFFFD4D76C3D76270725CBFF297D0F26F4A6A60EAD0E94578809335BA306F510900C3077AD019DA0F31A51F0460E7FDDFB387D1DD5155E247A375C0B9690F59CD9A85E4C1DAD2999C6CC24D4205589A78DD5BD12CD7 +Secret = A239291AD925BF51F94FEEEADCD80244C47041E7602555A5FE2B4EB1037A4AE4 +Label = D1830BE05BC1F55C69C52D3F +Output = EDBA28EA7B08AFD2E3263AB194212A258689 + +OutputLen = 20 +Salt = 5E3E54C59D6B4F1B07E4DE308D54DC50E9A2D2B041FCCC309A7455CB97F54DEDCC65427F0421022A1B3AB97D9D70B8BE3349285734440CE42A4EEEEBA54A88712C7C425B0F81779CD972233638D715C6018B2423606F97633D98A371E268EC712705F9C5 +Secret = 84A7008FCA8F4A6BAF31ABCB40A399013E83E5363876FB0A5B04C15BE91E2080 +Label = B1C9117170ABE1506D69FCF8 +Output = BD7176E4A79BE564E4CA65A246E3BB4EA3DC1B58 + +OutputLen = 20 +Salt = 4760D27591933F5B092A0A7543BCCC7B9032CB93813B61695F7578AC6AF20AA969E654FBEF5BD646447A031E51F7EC92F9DAC135038AC04E5BBB908D5E024FD67DFD99EA2123871AAB57FAAC239E9C9B2A1943DB83ABF9EE91AD5AABF0C96CB22E8BE934 +Secret = F2A7DE120940ABC458CB5854E7407331AEE249F67A22E824CF32A4C730AEC179 +Label = E44993510AFD8F8262B1C68E +Output = 47060B062D9B140918A97CB862306C7E0C4C3CB1 + +OutputLen = 20 +Salt = 6C254C7DB8567A58A9F7FAA8B3A32C4A3DC47DFF518585C25C55889E835CD98F09C0D85E924C8C9178C0A4FBBD15F840F7C0DF90A1930EAD19DC17625EF867A84A7FD6618297FD6FC9DA49983381F2609BE9C449C260C15F5EC02E2EB6EA2177410BF3D3 +Secret = 662B028FF727AE2C77B87E9DFF95A8F13C368117DBB5B28D041B417BFF9AC8B7 +Label = 1621C7DCA433B1B90B74F373 +Output = F452D57C00A0799B538B2E28B136EF88D39C2274 + + +[SP800-108-Pipeline(SHA-384)] +OutputLen = 2 +Salt = C7DD056E2807475B55B7 +Secret = 1ECAF0F20EA2E2DE63A1D426DA78B5ADBA3BCF645EEFDA387EDFDE1FB56650F69DC5BA62FF91810E309E445AB5BF4BD6 +Label = DB48FB658FB3C2E4A6BF4D0A +Output = AF67 + +OutputLen = 2 +Salt = 723570B0D1A14505FCD9 +Secret = 7B8662DB826F87F5A5CE1882FED7940126CD0BFD0CD65D21087CFACFD243A736C6DE38AECBEB639E41ACA3E97013FA25 +Label = F4311563BA8F24B6AAE469BB +Output = B79C + +OutputLen = 2 +Salt = 6B2A791326FAC063AD58 +Secret = 5D6519BFEC7BCB03A1C6DEF0F025F2C952CC315152796A3A0C96FF2BC55AA2C3115F3926C37464E6336C7A1F6135BF50 +Label = 260AE03CC88B40EBC3E8206C +Output = 0207 + +OutputLen = 4 +Salt = EC35E8D1FFB99DBB798673059AB3C72258D56EE4 +Secret = 38E49B9FC89AEBB087E33773357B32A78CABF52A5EC6F66F81797B7974A0CB00840CE9792CDB719416C5431791CA4CD5 +Label = 29E16EBE13DF05E1D4880B01 +Output = 4F731003 + +OutputLen = 4 +Salt = 251A70D809AABD4183E25A998B3E05745D46AA65 +Secret = E59C6AC268A056F38A33EC270904E64595D162FC13DD0DADF3B3DF7755B1986DECD85BEE1D5941CCB26F54A08BC73728 +Label = 4B6FEF2F087937DF4B490DFC +Output = D7488D50 + +OutputLen = 4 +Salt = 88926F6E7744E374DE66DBFAFEEE0D016672FD14 +Secret = F516752903866EDD8B4788C1394C99D5D8DE81FE228D724825A341E4A7F3D8B4EB8B187E7F630ADFCB1CC201DD9C819E +Label = B39A5B53AAF7E646B9F92EBC +Output = EA5344ED + +OutputLen = 6 +Salt = C6F5A23D57ABC44CEDADFD3DEF044FFAE69A4DFA348ED30903C53411687D +Secret = CECCC6DC52EA8C85DFDBE3E8BD1B80724F581CC98C1C2DB256ADE5F6043C335945D26CF77A31E31CC2C3939CE072BFBE +Label = 15712EFE9BE17796B2DD129D +Output = DF62FE5B8E62 + +OutputLen = 6 +Salt = 6EA6F77E8DCDDC97B7B627C959058BED557785E0F59A47CCD3FC26188D31 +Secret = 57D14A5563AB3BBB8FBA87D4F1C2BA6C7AFC0062BF336BF4C4CE55ECC650F539510DFF14FAA7436E43D106228D0B7411 +Label = 223FA0A42E117F4954F475BA +Output = 1C05CA0B9D7D + +OutputLen = 6 +Salt = CCA4E5F394A6645E9536299CFDD72A11F795B6EA57A17F6149F0BC7AB00A +Secret = 11D25493E353DEB43AC998BEF5081EE7FE41615DF29572F71A474316602259401AF978E6FEA42FB21C49D6C181EB29F4 +Label = 01877EBD22654B089AC2BB3E +Output = 6117BE7527EF + +OutputLen = 8 +Salt = E477E5C05F1913094AAE941EB2BBF64F867FAA9AF3AC625C788F24BA385747BC394DDC767260BA52 +Secret = FA33FF4B75CCAB9EED2FF37D04201ADC08CD4F9DB419208E80E153333EDA66D5CF04698E7329F89F7A6C4EF18BC530B1 +Label = FB90B0F63EBD9CE82C047EB2 +Output = 462569744DC230CA + +OutputLen = 8 +Salt = F63ED45A65206D4F7FD1F4947096F05F4968150DC1FCE7AE65139DD269BFA092BD34FB9E649A834C +Secret = 15E6FB12266F0B92F8F49E46F7C2FDA85CB2BA96BEC4473E996A0673E23FAF54CF53A9F7A2ADF902F3050DB9619D2A29 +Label = 1E0108B289B02B55A9B353EA +Output = C137C3C71D97001D + +OutputLen = 8 +Salt = AB05544C4894C3E0FFD1AF7613D5181C5C57BF588474A6A15247EB71127AC10BAA19054FCFD2E4FE +Secret = DBC61021461EB4E3ECAECF6CCF41F7A9B6C59757EA6696ABFC173154B61D7A278123BD16411C529A8D0623570382FF53 +Label = 9B7483846D64EEC19B32D5F9 +Output = A56A8E3185EDF4E8 + +OutputLen = 10 +Salt = F8A7D233AD73A02A2D558A7B1811A40C34FA939ACDF33705183FD0A869C6CFBB74EBA2596E597F60509E6BFC7F132FC349A2 +Secret = 169A31B993167A92FBCE6F633D96D70C334C98F1D9AC8AD15B6E44774125120A5A803A2CDE0D7DC8827B32D87E515153 +Label = DAC190BAE04E1F68AA315C40 +Output = C5A2FFB3E6E44B66D13A + +OutputLen = 10 +Salt = C8675B20A3E9AE81508797A7862CC6E7070731F0C0278969688D5274DF6045CCE82C461A7CC4FECE54D5119A6F80E78C810F +Secret = AEE5C7DC3D5E1C0C9063F745387037278EAAF285E66BFF5F633D965DE66EBB06235A1B2A2654FB3C8761AE2D5822AA2B +Label = 1A95267E5F8F98AD954E8DF9 +Output = DA4F6DBF4E6AF6503DFE + +OutputLen = 10 +Salt = B6D30EA1EF84A0149499C6E6FE0F6A0BCA42BD99D02D6EFB671BE60E822BE2D9E4525B057621609953F49AB0FF7DDFB6F1F4 +Secret = B61BECC74EA0F95FDA243E4A8FACDDA23A07FE4C7AE12FBB1FDC6F61EBC802163FB6EBFDDC95190C2A675019127CC8A9 +Label = 7DCD4ECD818BAF71B203521B +Output = AB743559D3A6EA337A09 + +OutputLen = 12 +Salt = 387B6BBF7C9EB16C0BAE4B8236AF88A497C2A2627B09F4F36A0AB1D0C8707EC38106604CC8F2A597DCC4A52B03254E39B97C8370385E15FA1415EA84 +Secret = C84A200D4CDAD32F5560515590DD44FAA8A10AE3D6F7F3D40A918C8C58C435D8BEA1AF5E02A9558B9BBD07EAE5AD69EC +Label = CAF0630CB9EA0A1271363C99 +Output = 3F5E9A2C64074711C3325423 + +OutputLen = 12 +Salt = 6CC244D2467717662CE2AD4E92FF229BF8D88E60D35D1201F9B501D27BB59E702009566E61FD6B8D236957CDE732CA1506EEFF0529997EAE9764EFB2 +Secret = A671035FF14FEC278FB6007649F4FF7F72FE23E5DD1D2AA5BC442850E9E9901C9FB034F4E97893D9700E01C4EB0227C5 +Label = 380E24F847C98DBCF85F0121 +Output = 284F56B595AF0C2E4A33FCD1 + +OutputLen = 12 +Salt = 82FF3929B330E1BA185944AB07198DFBC474C04E8F767E5D8723F4FC0005864D0CD5C03C6F50736974A9A54189047A7F035CA5A406B449C54E8CB43F +Secret = D34B97389554B24675A9BE50AECA65ED4A2565C85FE87212F8CD0F2A7E9C36D5F0B2FFA1D58A0E18BEE68DF9AE4065B7 +Label = 48BECA8691CC02AE84831838 +Output = 9A630AE62042914472469484 + +OutputLen = 14 +Salt = FE91E3AF5BA27C9E37C52252D6049AFAEA310ACE5AB05DC5C05C9006E51E39D357C100342B3109915E99B89D21DEC69158A6757864AC00DA0F51F79D6A8E56CF609D5C4C8CF6 +Secret = 17DAF15A207CD0A0CB75D26FF0214B7DFCCA59BAFBDC949FBAE9D5FB16071B72EE850AB5307C443F1E939999F45D2223 +Label = 646255CB6E2992C5BBE3A691 +Output = 6D6B294CF6C7A5E869FC2D061CE5 + +OutputLen = 14 +Salt = 26B0A4A32B6E07A74B55E5A60EDFA47EEC422745BE727FACBBF7B5CFED7BB84957A1466AC66F88683BFE67AE1D068F97C15C1382C27C68DAC0AB60728AFD8B7EBAC7627067D3 +Secret = 8400AF71AE4A1A21BE69EA8060CFBECA42FA47195EBCE454049E88A9B1C690F52330E8E658902350513D03DB4DD370DF +Label = 47573481F9216D12402C0B6A +Output = C54D224EE07CD953B5BF8D8B741D + +OutputLen = 14 +Salt = F826C8AD6D4B812DB78D95EE8B82C24D37303C9FD8209C07C6CD0422FEAFCBF3C1AFAF2A54D1E9C52403131AF6A50E17C7B02FED84E45D729E94543789AC96CA0A8682D1EAF4 +Secret = F8EA9540230980EDFF016E1A74104584E57FEEC011B5FC003C0F1A9C34A11EE81D0D50EEB2DC9A01285F2D59BF410DD5 +Label = FC9C98B30391E931D2A74573 +Output = 3CBBE54C1605A53F1BC96C623E66 + +OutputLen = 16 +Salt = 082F0E248FC4CE1D5E5C3B6E331BA912A11CA3BF1E29B2D0BCE178166F94D01D015361343D4FDCDA72919E8C6AE653BE2D152B91B4B369ECB434A65CE4B7D3C87BDEF2C8B5A70A020A05BC12BC7D32B6 +Secret = 677E6F1F3CC4F77FD398E5F085A4F6AE4E54D746B462A212E3E6049888D61CBDC29CD3F224B82B666CC3623E56E6457F +Label = B02B4DD81E626A5AFB755F3F +Output = C6A732E615A98BD2EA46A3AB81F1C0FE + +OutputLen = 16 +Salt = 55C182C9D2B62E3AB89D9597F3EB5B01C43E49D3E066C666E96176196F9598AAE006134D5AC93A2289382DE46022F7E8630E5FD66F55DBCA0DC2684AAF0B51FDF29A91DDD0F2A69608E9FB9EDF0461F1 +Secret = 47517DFF18ACE4AA07BA0301E39896D6986AACCD2063DB302927E8243498CD25D99A2C0446A752F0039301BE714684F6 +Label = 2C094154FB5275500D2C5781 +Output = B08436FC81D0F8373D0D2279D0F872DF + +OutputLen = 16 +Salt = C3857D1C16368A5C05DC404E9755E9769A3E1AD032185FDBE01009866718F57CC381206528D36FAE5177E22349F8F7E8BD4F5058D947DC965F8E532F47B63A7F5C6459365CC35C406FAA3079C4E5E53B +Secret = 6D989E5C1133841057893404C76DF88C1B88C653B6862957B7BBA309419E299EA03C423B0B792197DA563EF46DE8B2F1 +Label = AD58D2FBA6937CD262BEDFE8 +Output = F121481E5A5A0A9A27672E548EEE2E77 + +OutputLen = 18 +Salt = BA59BB525AADDD44DFE1C52D18681A3EC7791130D09333205E66F984ABD7199AADD21B4266FC555F3B37431846A441DA4476F3BC2BBC2BFFAAC8B3E27B1A5AB474E63AD8A7FBFE28B9A5C540509227E115BB765506871A15C5CA +Secret = BE72483FA5C9623D50B276D6515CF5EE2256B86A294DE41F4F444120C13A6858A823A35FC943196F909E6A2384894BDA +Label = B20E2E0C7070373A98C70E06 +Output = C231FF36CAB91041BC00EDD9A5399D9A6209 + +OutputLen = 18 +Salt = 03A89D71CDE5415A35825AB337E24C47263367E8656063208B67C23B2A07272DCFE7626341E6EDB55793EEC65FDCA3072A255DD9F8E36BE84FC8663B64728F1E68AB229EDEA0BB3142B56FA9E801284327A0382EE0EFCD43D678 +Secret = BE2414CFBD764582C8F173D7384037D5BA89D674DBE41BD03B5255BCD37829B271167CFE87B1E749EE2C53C2E100B813 +Label = A992A30541AAC8B31EBF169B +Output = 9C25B43124A7DE027FCAEC12A2E0606FD083 + +OutputLen = 18 +Salt = 30D47E1477CBEA431C22BB03F9D6D69E89E368DA5159A02F30FFEBCC5A6F76CA98BAD6B1A436254AFB468972C4CF5639833394A7F51900737B702FA2557D2BBD42D66F8AC4A96F70FA62389710E49BF50607E744440E9D194BB0 +Secret = 7BAB435F69C2F084423A2CC3554AB041BBA48C5397CC13E0BA32496A1F1EC6676202E4061591AA5AF97D5B7129707C21 +Label = E1A513C5A46A0D9504AA3668 +Output = AD8E95870DAE4F437E65A66F1F814BBB5FD3 + +OutputLen = 20 +Salt = 5DB779CC1416899D0A72AACD22209959E43AF1D5CE8812A5874E05BBAA48D95319EB9086967AFDBD03F331598686B2D266662CD2EE5A3B504606731DCA495BD449FDB4AE65613F14CE6A1E3FBE174494502A9F41DC704B79ACD1778DC74F949079BF85C2 +Secret = 76F2F58A10605073DE11FDF95A895F93DAA766C01D9FE0C414EABBB5974BF4B4A5BA529E070FDA4C148376CC90F7464D +Label = 5B5AAB660AD8A056EC2F634A +Output = B1B15BE5ACF209B5B774586A0BA0146F5FB033AB + +OutputLen = 20 +Salt = 0D315DC4A402BCE2692FC5636F08457C203ECFAEED0985F8319240AA895535B1BC3122185088324A6B72FD979D476A566582328394332927D4F5CCC082CDDE6BA0A9BFB1884E05F6FE9F6E0E5D7A1996616D6197191694F75D907C92681ABDD3CCB5AD2F +Secret = 230A3D5117788D088EF018B79FCB61EEFB3DABFFF93C22CBA250F5B2C4AED7DDB05071B8784276510AE90730C01D87DF +Label = 8AA3CF184C376099123C6A3E +Output = CBDB05AFBCFC0E126FFB903E64398FF40D9A1B87 + +OutputLen = 20 +Salt = 0601F0E11C8862603F56A40986CC53412BECA771EAC0255CA30B3E88BE7825A4F56A441274DBB68BD1AD1503A3CDE3EDED9130007C344F4041A8BC99C48DD32435E4220A19A5A9BC0AAED408978E8F1C95E4334439E87A33224A158ECB2D33AAF61E37B2 +Secret = AC0258BE324EFFB2D8B6382933F56040E46471969C6FF944EE24BD3D6ABC5FFDB1815B49E5AE19DDE087A354EF933695 +Label = CF0D784CE58A1C5E8818E9D0 +Output = 735BD29382001F05DF7CFE508B39A1A18990036B + + +[SP800-108-Pipeline(SHA-512)] +OutputLen = 2 +Salt = EE2ADE03A78F200A2D89 +Secret = EDCA47FC977F4F8E2B0288132AB642EBA0C91E6A503C55B5A7DA5DF1B482CF6AB5A90B19FE1D7B2DFE6CFC270FB7E4674B88DC5868B2BEDADAE16633F357AED3 +Label = F83A5B6FD43318E4B1942D43 +Output = EC64 + +OutputLen = 2 +Salt = DCCA7F35F4BF14A482A8 +Secret = AD072D4C757D1389EDF6A72E5E0D5BC54A65D665491FEA4C891B12F8714391716084AB09E19D4C47F33EC93A75FC0F78B4AC4CC850947B72054A0B284E1426DB +Label = 612DE1C145AC1A458CF774F5 +Output = B9B4 + +OutputLen = 2 +Salt = 24F94D5268FE022875E9 +Secret = FF5A4DA24255191EA61ACDFAB7F2B8DE1B4300EF811D8ACD79AFD22227A84F1B0E2A96B38406C8ACBC1B41BC0A4EB9471418FC0E8C58AF5E96E75DCC98544AE9 +Label = 761F550527AF9F27CE608DA2 +Output = E84F + +OutputLen = 4 +Salt = 947CDE6D2D861DB686FB65BC0D445A5E0821FAC1 +Secret = 4309C94023530BCF7D36687F7EBB03E3E9ACDD293ABEDE8E2D0A0A474DD3DEE748747D4D74D39F5691D31377FD717E35BF4D0C5C00150273B0B4FD7B72A1220B +Label = 9DDE5F16F8DBB11CEB19DBEF +Output = 2DE22CCF + +OutputLen = 4 +Salt = 9032531E44AF275A0878DA2C87168BF6EF4035C6 +Secret = D65EE39101AF135BA1C09DF1FDF9BF714F3BB5410728965435581FD53A6718CFD299D975E77CEE5C9056665537D4942C19A665FA3085E5C57862BD5260A68743 +Label = 217A3C66F9DE1811A0088CC7 +Output = 4D15914F + +OutputLen = 4 +Salt = CC938A27122421B7C79402B14C3D1B14748F1650 +Secret = 07DF2AAD2BBD6CCBD271706872A8A6E22D012A9BC965C0E62A90FC4C0E5454F639A6BB9A6577671C5B856A22E3CBF88FA151905A9DCD978C53FF86E968C97734 +Label = EBF1E7F1E9273730EF8E3356 +Output = 357F6FC8 + +OutputLen = 6 +Salt = BFF28EE1A2260D1CA93E16A1024D584DA0B04A9E4AA335E309825E344F19 +Secret = 5060FE273A113E6CC6D435ADF09C99F5578F28023EA0C1F531A14D3E349491D262DDB30762B9148C28C7375F7C6B55D9AA2D15880E52B828EC922153DD3C7D17 +Label = A25A371718673DA2C9FA04E7 +Output = 54BF1B647A2C + +OutputLen = 6 +Salt = A7A4022EEDC8EB1F3AD08F20878773E59817ECB3EBE297CEF6E6AB0169C2 +Secret = AA51644992ED7DB8ABB9588B66418ECECD9941330A462C2670597A563FC718008D65C719D5720395D0A5B709704F43ACA9444E854142100941EE059A1A01B592 +Label = 078226223989CFC97FF44CFD +Output = 3A99268FADE1 + +OutputLen = 6 +Salt = 141CC7ACC9690D4CAF3DC03947DD61702D32C3725300F56D879D0E2E8C3C +Secret = DBEF65632F587BE0FC71DFE15BD497A4E42C44D2E3AAC130044DDBA82F3E570144295691BC87BA55DE6280A546F321E01A6C5BEAECD66EF64A34245DC1F1E40A +Label = E87FA27783D9917AF0688CCE +Output = 28DA406B0F53 + +OutputLen = 8 +Salt = 999E5E1B5B41AD2CBDA185215152350E1C8688E4CE9FB63D5FE4181B1466B58C92E4F7F309AADDCF +Secret = B11F6F3E5D01A9C6522E3727608E6BBEC072F924AC2EAE38DCE467BF045424659035EBEC25540AFEEEFD4012921D88A8A34F1A04E6D4FEA9A9EB4ED24BA83B01 +Label = A343AA4F878FBE64DCF26523 +Output = BE0E6480491296EF + +OutputLen = 8 +Salt = A4C049CC4E6CA67200D8262D482FAFE5A88C250B764B2CE53EB1622583C518598D198E2B50B6EEC2 +Secret = 2658DC45AB9A4F65DC6E2E983EE77BA8A7FA0A10826266940E8B92D0BCE6986C8BAA1ACCE32086C430D3A6BC5794E3534CA98E91E59687753656CC8B2E9B6353 +Label = CC7D5513E88646068D836573 +Output = 825C65E91FFE0EB1 + +OutputLen = 8 +Salt = BFB896B349CD67633A6C779939F1CB4E763686E19B56509F1954B0F44E1B0A7C3E5F6722D4255806 +Secret = 0A3ED622210ADFFD1A8003ACA9561B6D69AFB4B2B15E96B318CCEE3B8E721B258B95AAF8CACE30D87749E5CA2F835D9527F7BB10BB4922ECD1A26C8F98FAD83C +Label = 0AA3FF88BCF138DE9820C7C5 +Output = 7D826D78D870A0FB + +OutputLen = 10 +Salt = 561CCCDED2D0E95F6FD5F9A0625D818AFD21E71D6FBBC0E20D3A31513C5F4AC0F4956C8C7F38963E21675CE6C9D432F441CB +Secret = 109030A1E5B64EE4543015BF7AF42C197160D6E6167CC3BAFCDCD17BA442CB65B71AD45CE77A9A4B226CB030D2E0D3B06245EF65ACDDE63A988AA7F860E5FDAD +Label = D4517D38A4CF1EB031D793D3 +Output = DC038121827D1DDC4328 + +OutputLen = 10 +Salt = CBA4AA7CCD2BBAE49569E29FC436A439DD8D2CBE815677AEBABCE7E39FB98CBCC4E510A88A7CF86EA6DC136607FD0D776862 +Secret = EC56254A60AB9F00689E7CBAE6077E2A76D1D3191B11E70E742113361EBD152B6E84BD0CDC562D41CE4A34649A8A5C2E1AFDCAF0A01611B7D1DFA9EB3402EC29 +Label = 16EEB4E1F61BA50794CBC228 +Output = 71F076A83058D6E33C29 + +OutputLen = 10 +Salt = AB4578CD70630428313F756D42142FB61774EB5F7C33C277A26507912A50DD490F36D2F00EFB8E73ED80ADC5F4B75B4F35FB +Secret = 956F1837601D7CA17A2E9C75FBD80877BCB086133D184825FEC96110D2439BCF5A2A90A2FAA10CED53E1FE3E0CE87FA443A9D6E136ACAB211AA0302A8579579B +Label = ECA2468A14CB14DF14C2BB42 +Output = 2660E65F69F7257F2990 + +OutputLen = 12 +Salt = 08BDECD6993A09DBC6C382843444B11184A16F2888E7354A63B0A850834193533D08FCF0DDB584E81F3A506DE0E7141595A855E4E237FD665796F9A5 +Secret = 931D84DA367162707B82E04E8A687D283DFC0BD1087332D972853C262B8686994AC460BA93E428E5333C5A2CD4E7A901EEAEA408AC85D65E5FF807FC4D02838F +Label = 056A7829B4B3E10BE2E99FC1 +Output = D6E782E9E250599B141F9E9F + +OutputLen = 12 +Salt = E5C99036C684A60B5E3DFBF3B74DB295D986D765A4B01DE88B61F88921457B32BEA6C3E3A32C31794C5E3DEEC5DD2088F0873DB82AAB9CD13C3DF860 +Secret = 5333D068666AAF916A0D69C2C9D625F72981206227EBC89402A15D12D1861FCCE1F957620E48D2801ED73F915C642D1B7495CB8099871C4D63E5800A9CAB711E +Label = 830EF306A74522B2DECF385B +Output = F41971B96C4DF171AA739E2A + +OutputLen = 12 +Salt = 26E011D626B0A3D95B4C0432247FF99136BBCD5C33808B0EC0D72477284B19BD00869E1717738DF4740EA345F6FE2CF8BD60DE8AEE0EC65E77351917 +Secret = AA211CC6AE1566B4786AE7DDD5A3D1E1577E1A7DBF941341C4B486D4C4F094177B023A1919E40B9F949F29EB3F5D01F4C9A0F623645F7A32C94FEE23CAD4F66F +Label = D493D31BAC4993C50798D801 +Output = CBA3A24B112028398F269F43 + +OutputLen = 14 +Salt = A8B4B720214C8286C0E76BA2A2A6807276868638CD6D4E2CB00B6EA93C94999481FAAF06A58C05025A64E03F51A36F5EF01A17F60A1D86877759EB14B505AE3B7501CF37F0FA +Secret = 65ED976DA5B3886FD102388D5DFFAFC8A2B6D3766B72BD93A25355C78893F7230FF1BA60718FC6525951A34947763CC18AEDE13E26AFF4CE61676F3F8B499521 +Label = 0D4F8A5C473695E166377FB6 +Output = 1D1FDC33D9CC8C0FC8EF79E1A1F5 + +OutputLen = 14 +Salt = D636410381D9EC4B6D1F80C37C6464E6AA5196E9E45D7FC8AE431EE27E2BF396760D9BEB4CBDC571876494B20B76407064C319E96BB176D84A61674965171FCABEF674CCFD6A +Secret = F43829B914280304B74FA838C31143903ECC3CB678C8ABFA4E731E875AC8DFABE1FE9E76BD7EA61864317E2E1BA43E73769438BB2EAB9A2B335DF4A6ADC1DFAB +Label = E473028D79E4821D3C6FACF6 +Output = C529683D3849CE409CAB71D5A1AD + +OutputLen = 14 +Salt = FA10F5BB03459BFE4584F16184852D6F03F80C4E68DD4F09C480826A74D80E87E6BEDF05872D392EDE67172433E6D6AD55CDF33340DF3451BA50A151EFA9BC46F956D03AD582 +Secret = 3AE7E08BB2D9EDEBA324899D0E0AE360F6ABEAA3D7FA229997BB641B94367F426392922C7523EF01279FD00E9D42161C7FC2FA4AA3B1AD4ED5E2DD8AD514F8A6 +Label = A8686508F9ECA7D436950F3B +Output = AFCEF13A989F3BA3CB7DCC30FEC6 + +OutputLen = 16 +Salt = BE63D39B2101A687C14D592D6FACAE34E204E979F5A46E3D67DB94EC1A4DB74300975C394E9E896EF5577BFD1B9B00798FB0652FAE0A7905878DAECD53B8BEECE0A80D9B8FDB3D7CB0C313AD963282B9 +Secret = 2165557DDF29179CC1D63FF3D7EB5F3F895B43D6BC8BEF2EE7E54D13CB92BF4F38BAFEE6CC15C45005FA81E2C69F79D6925E197F1B7EB5DB9FB5D504A1537460 +Label = 8056B3ACEFDCDCE8D5F890D7 +Output = 3FC3AE22CFDEFE372C2C24F6829B26C7 + +OutputLen = 16 +Salt = 8EB21A04705FCD4C1DEFD7E2AA896CC6921FC916FAC2941F95C8ECD51D341942482D63FC8BAB5D65C00D9EAFBDB49F0C58DA98E8F2FD0D201BEA075A447DF4CF92772269B37AAB078C3AAC3F37054D22 +Secret = D7980A2154231AB28DC6495DCAEEEEF7CDEF10848F443240B812E8D8D6FB4D962D8CA9CC35FA48BFE85F3373B018B3CD65CB28C1CEB4E49226C6A7B79CD66B0D +Label = 8C728083470ADB2EDBCEE621 +Output = 64A688514A073870733F98814EF4F12E + +OutputLen = 16 +Salt = 5D7269F3085DD932F5A1F211EE16923A4B993D7C8303EFA080DCE4670D43269204E1E64AD7E9F7A9F8CE5AA59B45D65971B0B0905A7D5BC277D083023EE8BC91BE9F298241BD5A823F2465C58FF27203 +Secret = 54813C49948AE5FD1CF2D465FACC55644B2215E977CC058362C034A78CFC1F2CEDF6A2A3F765BCE0E41D2002F6F4865699E415196B6EBAEDA10BBDFCAE32FE1B +Label = 97B0C4D41216A15D4AC0579F +Output = 1CCC861A4546A6429F0353133E5806F6 + +OutputLen = 18 +Salt = C3C0A817B8CEA16B01D1D56712C51BC9668E948A53F0D31457229C193DFB7BD048113F37D58CE791C018A27A0CCBCD6E2A5B89E4A912C4895D7CE6AE16B67E0AB9568489B46F183119C05C3741FB17DB1ECF9878B7E3293F16EA +Secret = 88E5762C0C4C8C78D76E50841EB9C1021574731D98BD9935C99199B49BE25DCAF46D21950A0E03B4075DA2B37B5B0308679E46CFE9831830B85D17753789CC21 +Label = 04369835A27CBDC08A3FBA91 +Output = AF1BF1972E71BF66660B60C1275171092EB9 + +OutputLen = 18 +Salt = 820A0566A5AEB879B804DC7FA280265F6214EE8D25AE28F66B03EEE3EBD78B3A89E0ED5A2C13C7E70AB797B13991151EBEF06312659EA08CAC2BCA283ACCC71BD9726AADEFF2EB9DEE50F88EB4EAC0946D3043F8092A0A1482B2 +Secret = 317B55A4751E7821F9376A0B29608AEC2B1BE9F132417ED882EDE64868DBDEE7FC028D010B882C7D2047FED9E8E91924AA15CDC1E773C51CA814458E4720D8A6 +Label = 7A2B9293441A7E5D30269893 +Output = 8077F2BBDD3BAC10F0DD1572EDD61A78B673 + +OutputLen = 18 +Salt = 73F6D88B3957DA331DC5C093E52C6F844495F4AD8129A39EBF60687A17971C462EC8C7B1778F72E62D6133F86E053897CCD21329B7536BD1529F8C4BC28379D5C8352C75033187BD72416C5F9E2E78B25479770B2ABAC069E963 +Secret = 94CCACF412304F0BA7511D8E57D8FE40D434F3DDDD6BFC5EDE6EB31E75F35EAA027E82BBBFB8AD3BD52CD41B0A223C079D3F420B86E3DA74F4606D98DCD97771 +Label = 4E8F16265B8336A6C39DAC4D +Output = 8E95933ABD387701437991CD60B65603A611 + +OutputLen = 20 +Salt = 3AED3A35ABEB06C613E14D3A4787EB7A8C62E3961E397FCE3887746A9692BB0B0AC6C53DB5F04A5D41E53638A5DE1447FEF7218DDF13CB00D678DF12E145722A2C4741A5CECFB2AE62698A24D78CD3C08BD23890F639674965DF273644EDBC6ADE2D9C45 +Secret = 21ED4DD53BE9086820A28D628AC3E6C14D1D5B1BF008A787736BCB82E691372CBDBB72F7F53E909C246A6846855F125119AD5C98813A11D3BAE9A7DB8B9FB975 +Label = AC5820AA5E58FDF2917B1247 +Output = 18081BF5E26DCA0C25E6FFC8995665FE5C770C44 + +OutputLen = 20 +Salt = 93A048525DC2BF5BF5D79754E36D7671F4742A932AE267D4186834463CF893ED3CEA006AAAB1A5CE9A135869521B91E93BD74A7D25E372189E8B1E1F1C3917AC17BE568A411F9D469FAD912CAC9EED83641CB0B51249F7FFB7F877A29DE976FDA65499D0 +Secret = 1243E70309A9DDD689F3139AC00DEB500A20D1478D87FCAEFF9F78E520438AF5485C7B1E914A11B53FA20E6DBFB72C8B9354B0448D9AEA131CBF1D4055865294 +Label = 8E8F1717ACEC2A7DF81BD5A8 +Output = 12DB6D019231255C8D8B48FADD55C1900438D216 + +OutputLen = 20 +Salt = 259C47BEE5FA8FCED41EC22EA7BB5EA22346B30DC3FFE4425C4F98DD72994936E02281C30272671F7155F54915F545B751A36A695A1DC90FA38D8733199298590284862EA951C60A3B78D9A8A63F671C13615706266CE7C2C9DBBE25C428E7D28BAFA92C +Secret = 0B9FE0F42A4A90D66CB8B1E17C43C489290C77E2C4110E50C43627DB7EBAA4AE31105E27DA29A37E37F4D4C1AAFDE4D4C467DCD81F9EAFCDA55FDB8FB0239937 +Label = BD55608F6C9C85DDAFF3F3AA +Output = 12D450A798BB45437564FC4CEAA7F1DBB95A3C23 + + [SP800-108-Pipeline(CMAC(AES-128))] -OutputLen = 64 -Secret = 34f0c2542bfe13c7149b68c8a1ef636b -Salt = daefcc52d6e32e1614109268933087fce3d64a5a6f111ba1a8d343a1e388a1752aaea93853be52864997a81c84b04c4f3ff3bd -Output = fc0eae673e7db3c4660668e187bcd81d5ca9b89213d8d741e71c9bab89bb4fb3c4df541d89a8117f0f56b0f15111ae28abf81fb7d7349fbbcaf01137e4d73527 - -OutputLen = 64 -Secret = be5891fc6fa41a9a1f2326c3c2a4d27a -Salt = 08f704a2f507dc79ad715bee54b3df13fd068c3e61d014b29d7e05f4252649d371fe1582d390942ae998cab8e44a54404496f9 -Output = 87d65160cd4d49103aaf1638ca49b3a232dd1217ae9ab1757bdce3078cbe7f8ea156c7cae559348c32522b32c3c6ce9e9cf57c375e6588aab23340148f3e8e5c - -OutputLen = 64 -Secret = 204ab6fab7d6b2c37a07fe3f108f1ea2 -Salt = 1085a636ee3df4eb19720044a9203cc737bc84823d55e7b6ee4be10035b3fa2e26c30ce3d930508a5bb9831b98724bfc8c37ab -Output = f543b6681a0b0fe156e2c0dcddadce2fce68c33d98647e6edd7078f3879d1ada280556069e722584e745865b3ae8909a1fe368c8b49a19d0dc0e2dd347dcac7a - -OutputLen = 64 -Secret = 2577055dafc145f63015e70a9bafd7b4 -Salt = f36b3b953a088e5a22f652971457727346f42021fb5abcf7fcc1074974481807001e45989498a4bc74617aef2b5c8d8803dad3 -Output = b4a75be0e5094020fc9fcab1dad0574e1b913b68401c0cdb13e0995ac6f0b31bd65a5d6575aa48804e93b357c7496c3eba86d21cc3a5bfb4370895ce48b8d117 - -OutputLen = 64 -Secret = 695994d4050a41ef9a8bcddce50ca807 -Salt = 24a1942e047891dab62bc8925a34604625c0a63ea7ea87264c6ceb602b293129986c6ca1bd325c1d7b5cd422b25f4204495d91 -Output = d5c3aeb36b1fe7ec51aa3bfc319328b940492b06ee089c4500b0e6466db6e77a87392f8a3e036205006a315a3aee1a4b3f29cb16fc4e1401d8c87ed65d578529 - -OutputLen = 64 -Secret = ae251fe9dc30b9d75c52c6762e0a4aed -Salt = bce241ecdfe031faae201950262579aae1b956c46f9b4b683e0fd6ba59658d005d946e13b974f05d348fc1b5a70eb680177b0b -Output = 1fc49bf7a8b9db3dd131f8ff63b7d8bdaaf1507d2ef9150b01b6bbc1c7b201d6c918386c620a49ae074d5b04450202a4cf310c509a8180d3ae58f7baa72abc92 - -OutputLen = 64 -Secret = 50d98436fe4776a334bb122c34ad0dd7 -Salt = 3273bee62244b2854dc5e7c3d562d9c1ea75650b5f073b77774de060c9bc762a59455abead16ff0d01563986307face8065f39 -Output = a6bdbbc4a5228b46499d496a5c8d61de5d356e78dcdef9889706f151b5cb92013fd89a11614fcd2c14898abf8127b2d1d599d4ab777537f6507bac0f46da6d4b - -OutputLen = 64 -Secret = cabf4ce9b7c3c6390267d90f73590b3b -Salt = 4795d89ce7a01e3765d3fe5b2e8c283246a41dd1897cfd32f5b3921e761bb10a5a71d9d7ee229806dffa2d3ed102c466e20a8e -Output = 8dae6edd9faeef5acb333bdd1e35ac0b6f92cb9445aa18af42d024e634a195156405131edeaa37869718db9f486fb3520fe43b1fd6839ca3e34998c9c1460e50 - -OutputLen = 64 -Secret = 69ddc088cfcd494307dd23d9aa90c4c2 -Salt = 28b018064ce6537784b7063dac10cc34b98fdb107852dd55d1e517948041a063a471aedf3fb20bfff8776e1085dcd2dc4d6389 -Output = e10595f2a154a875ff7ba872737657e566137972757b7c4999d8a436555ec709ca444cb35a95574604e2bec903b79c459cb33432da2741f89914ee8e01f33453 - -OutputLen = 64 -Secret = 0121de6605269f86af5dc53207681768 -Salt = c265cf6a993ffd309db9f9b043f2d727c0e2c139e46e2feebcde86b265e71a1b00049735c385cb86585dd237e4691fcc041700 -Output = c1acbec3654b19b3534102303780b290e40c350feda0e3e0b408e0879eca2465fe6bd953d048810982a2f83da219aca8adc34f0956f522c0cef805d34b32b965 - -OutputLen = 256 -Secret = d3a77b1341031fcb83dfa844d051a8d2 -Salt = 9591f37895996bbb99ddae95e193e02f06fe619bbfe3b79d281cd75f0e5b38be18aefc2bb2436fcb4d020c3bbc4b65de16946a -Output = d88d7440e4cbe6e44540f6293c57f2be1b0a06cd4b6d74ee7b1ff92bd4602d343a36f0e21fe8688923c0b89f193a94005d226982650926710e2827cbf99d5806a8d3de72d20f3ca1f28f5d3e19f7ef4b137f6deecdbf233fb6d05f501e33fd97ca0da1fb9d18b009cc2088a00d40c9a4416670cf352a228e0d2bace7f6ccb64d836d022a33b47bd2cc294d10de64603c3351332e1b0d8a4b472d99b488d84dcd73cdded2bbae43f1d14866aa3ddf3765e29c45063d0a9d5bfbff763aada4a685ea581db7e78d8ed1a10378e27e47f81a4ba939bd3b84117131ecf00e5f346e4b2d5bc461bbb58eeb4ac808372570a514f1ebb079c953878db3b716ad894d11db - -OutputLen = 256 -Secret = 970780c4fdb0dd91bf8b50e6bc0b6a44 -Salt = 3b07f1d215a1f4e939c7de35ffc04f5ae0838a75ff0392ffbb80250345836a197dca9a258bbb7585c6ba3e2c1919fb37ae7347 -Output = 381334f0e972e3eb7df54f39c03471c86a1e9e4563b487b62769970dd72cc0f978913530000562349ad13d1e28998371d12d4c0ad9485de82f2db8ba570987baf4a4a41106f09bd4321a3de8f3e4d8e9048065a59901f8072f1fd4375106924269d1fed6ce2a70909a103e27f577fc1163298bc486301aafd71ba2dffd34c8dee45010cc3b6f10d15c56e0aff059cc37f68b3474ca80eed361efad7c68618380bd9c405096980a79ff98472c5ed6e0920f68555c174de1b226c0a34f9f431b9fd7d1075d209a1924acf17c30d9ebee94b9501b60e4f2a79616b3a79558fac1b8c74078e747bc934a2fafce5a72f50fab6955ce330f60559ff84455066955dd29 - -OutputLen = 256 -Secret = 8f6a526046e922a854758e7a9b188cae -Salt = 2627a07bff38e9ad59fe5e0542b02e1943154dcfa564b2aaa07ce113a7eecd42fc90fc02ce209d9b715591fd4768f5547f6702 -Output = 0f6fe446ac3c06755fb65e4a78a268e7d495bfeb0089d756a0625e8bab8463e98879061880af76eb39136bb79f4f97a663e4ecce50bf810ff2f23294ead4990a801c2d5bb3e33280a3b06e5da16f4a62973e14ee17be5a952607594629145b8d708d9ab1d5b98c68100e0422b870a61c68b7671ea7e9f62194ef47a94c38d290d6057597c6f3b6bce98fbb14cba49556c72723f9a35aba8e899246abba7e2933fe050ee99bf56997242c9979bdca1a3b5cc54f3df6af8f8b28c2d3ab61c6d8f24d817e994ad360c0c91cab46fb4b4b8ccd12ffb3f0560491478be938c0647bba46dcd63025d2c1d0a60f4315e07ecc6a40a6b9fa3161e0f5b3b0367a676adeb6 - -OutputLen = 256 -Secret = f2a80dbdeec24aaadae4f495823c6153 -Salt = c18fda6d8ff00aacbbebef4ef8b5eacd7ccd331a45677a068f6da07779206aed94ce300613a2508d00475e8e77a6f17e1102b4 -Output = 9560fc6ff28492b6df3dd3273a457a6bc959756ec4b27ab70f271fe9a813e94496984b95a3c1b917f22bb8ba4b1e39e40b25da71fdce5486dd9639f7ea77fc610400b8d3a183a9429bbdd3d5e37f9652b3bdf77bbebbc510f1ac98a9692ed627c975ab93409cc882bbe5bde31a425ee5b95108e60725113b0b805a2ed318e8e86842a209fb471053fd4c5381959a0f493468ed5dd41d5925af7dbb92fb5240b08ce66ceded27303f5a59ea81a274366d0b2a748fe57096949dfa68748e2ff61c938f2efcd979f309f02e539dc61d94a01e0bb97e5444feba7ad2ec1956ffcdda159d017e0f82cb172277369d0652b2160910b6a4e6fc0d621daec724119bd077 - -OutputLen = 256 -Secret = a0c62dbb8918d049fa15c14645f70baa -Salt = d556c8952dac3c51661376ed64814d8408de8e82ca5a748d04bcc6fdde308acbda928643da42fdaabc82a11c7ba876419a1a1c -Output = aa636a5867240d9c1c445a5a1e89631848f08fc34ae4309dea5148cd2c0ea06b79d7d367db46e3c7ed1561c1261ffb6f93b5bc2ee2d4ce128d485369ab8c016952b4cd70d302aed5f3d0342f50259c87b76d7982abfac6469dd5e898ff8725781a3fa8522d7ceb32fddedaa3b490d497a6f0605931cf09a37776b085c81fc5c67830d679d778d01b391181138ae112fbdf6914a640ee8a3f8c6261e5567ea022ca7cf485536e66bfcf1fb77b78fd1dc186595c42ddff5a94f55dc6b4c300cf37935a7e72fb5df7421c2047a3396097c88ce42a474c0a48b292aef1d0df7db8b195aa68d861eeecc0d99ecb1053e2c71a8733cf717a62f9c68e164f916a5a6857 - -OutputLen = 256 -Secret = 2ebec35054687d1413c7e7fb51d9089e -Salt = 742d46ddb7eefe3607c6cccea7e837ff264c30f487190aaeea52b76263eaa77cea52ceb35387d97fd685a6692a4f7baf8a01a9 -Output = e569d24286b4e4526b2d7f6ae78fe06064f5df35ee7458185efc50a939e49acd18b2d58d126c4e876c53ed52928b927fccc9299d6ad12ba1950319b2572a287a9ce8e4cbe85517e000d4e725a3dc146bcf98059f2cf63f6ecbf56b636a8cb6a7d99041cf27bd124a3ab527629ae9e4f97f1b61ecd323ba3b1751eeeb210478ab26e185d5d4f3e201c985d12ad9dedf9d7c6c88690205e85a7a5c9a4d3363302b271c4090c97ece44bf85eb2b44fb14788289696420bb8c322ecd7c0a284396566e8f135672ca2f26d88433e230265f9bc62475e0ea10eec3c518493a0b086c015f0b96bb35925c75ad63aec26211ecc9b137d58a9018157948fa8eb08a50c210 - -OutputLen = 256 -Secret = e420a64b2e5b8dc2fa145a69134553f7 -Salt = 984de6fdcb21b9b702bfa9106b5a313f8892da123239f6b557eadba67c8066a45bb4329769fd45b8880c5f9ce27fb4337fe682 -Output = 5708704354cd68397ccef487c75cf756fd7dc40b9baf2d577778d8af5b8bdda1efe32d3893503c796f2a76e58b23830f28f3cfcc441ce6b93b762819520f2d2af99bffa16c2cab349625ee6e951b11c07a97619dcd885a127d93d9dc25a85704db7f75b2de59a78bd6f571ed5e6b844af55591485a879bb9d95841798ce76f0602778ae02573ceae90b2ab2f70c80d1ff31d726bba144c007bdda641414f7d074e152aec3d6e938d91fce724cbeffb0ca5fa2c6826dab50eccf5a9fc9a296a470435948fe9965d00bcd6414788fd2a2ee629cf7e903fda5bf0a81fbb0aa722bcd5ecabf752cc91e74456e9a6e3814d49ce4a2534a673a65bb39706d62de68741 - -OutputLen = 256 -Secret = 8c2533ad1c430f4a582b8898ff4a7a12 -Salt = f4715576b80df7105f708f653db0eb9d8dba6ddb97f78a59fb7b89825108288076195cadcf6c56030654ef464f5645de7ed7bc -Output = 4385e8b3c9046bc0cf7a0f2c5df6b0b70b489104c9eb8ac90774520127a3930d2209bd0bebd90b5dcae51e06b33c04ce15e782925cb4f47d08b945987452f1f2b08ccd9f3c51e9c58d47d32800738cfef204f48d8a2c610044f81a4fcacb92cffcf3d66a10199dbc351a5fb4f1b101d4f93eb201485af81a4c8eeaab1b30c63fc4d0414fb4944a18d5d1cf98371b2394179b9cd615c58c5aa126c77d731bb37952e3107bf1741a92152d6dc7b4ad10c02f45ed11030ea753178c6d151384ad9c5704d628377af139828aed7a07f085e1cef46f73e9050c3aa0bed37b78e9cf14979036293b4770c84fd115d73af1c5091d1ef6dcb96131d3411091a17ac672ff - -OutputLen = 256 -Secret = 3b1aff69ddff4008c4696af46fa354c8 -Salt = b611a29b136caf8970fb2280b99bda72e5767d4f125c07439629aa19cf859cbd3016e1dff89c31f13328ffd62631768e5058dc -Output = a608b01226b7fe5a76bd8d47b7c3f8f8bcd23f69005da2ac9ffc6f057b832569bc69cabecb50999da8584f23e92cca324b703e1ff2501c37d32cfd8fbf03bdf284a432b944669258c798d3725a2b431ebcb560a5c7656b3f9dc77c1ebb189dc045fb96f8a86c1bef24b3a4fab162be7231c910b1802d5f352ab183ec330555989bd79a13a0e87c366c81fe85522081705a742df68c867e168b062a8ac05cd653f0795a926ae4a392980ec5fcab703515b42213511b8f57a8b8f6cf358eb7b6d163772fe4fc95b1ce379d50971d88734b1bfdbab3527adeadac247799b62cb501647970ce3464e91a94470bd02ce7d8ffd8b9803555d30c10b4a43e29365eeebc - -OutputLen = 256 -Secret = e9ffa02468c4cebbffffec0eab88c8d3 -Salt = 8504aa42239961a5e582c356d709304cae1381f6b3b4c82fc3ad1e1509e5e4d671414d626aa918163d2cb6cedc9ba3e7a1fb05 -Output = 21b6e66534388afff4e03fececaedc059bf75f12c502a30355a6114f36db240bb7bcc957fe70f574cbddc74d6fd30985b2b772439c484876c756e29969696c99759639a425946ea3a9e4a1eca631a76a82c168f544892bf72e61c0b67bf3fb61ff5a734e84a86f9697a83f17d1a2d5ff72631fd75f81a9e9cac8cd8917a95f36937e6efdc6ab3ef3c3c00daf9b56eb62a6f3d7b5ef18be0be29dcf1cd3031c6114b7bbe9931dfefad6e6c657baed2be0f03037515a3a2e68889cfd2262f33e046cff618a53a4283b5c35f7dcb065c888d7b778c75e1492117ecfcbdeda25fe693a27a1091b92c0f220a71ec162eb8580dd85c5487f92d34dd24bf31802604b66 - -OutputLen = 70 -Secret = 2303ba6761332aa885b25e371b4d1015 -Salt = eb933ae1ce644e79078a78354b46f1b26ab99b68bc7526e8d583251ab4e0332ad6b10eeedabbb731706abcfabcfb40c00449ef -Output = b61b5033c09a120bea322b37779776503e6d0140b4842c0d16cc7712f6931fb162b0cd0cf577b026a8c5de53fdf54fc381e804503f8e69963e86b6ce1e6a72c972c6e32e6cd8 - -OutputLen = 70 -Secret = f8f44f84efd853aeafefcc58a1535207 -Salt = 8d5b6e687d517571ecfbc5c561a1c0893dee58d35f740f844aefe05a0f08a391aabd424d98f1deaa7705da19d3494045199443 -Output = 67f0c21ff94f3ea25ead65799ef6b6b018c250761dd7a92535af2a45e6afa77f3c786fa935c1740ffb767655db88971edd0632c865a1d4a097d948bb4e21f75812429b424e4b - -OutputLen = 70 -Secret = 92d6559a064df55f3262ba5b14e6a39a -Salt = caa412a922bce02e580a08c801e3c555787034bf986244d005d9db7f0a9615b76e018df200c33d349a24efa37b633b7072b845 -Output = b96689f4575b6b000f74ffd71d785cd2edcf5b890f6c1962c2231ef05a071c803d22040c492afc17249be8b5afcf95d30ded8bb90f33917c64a0c8705ed9215732037dba70cd - -OutputLen = 70 -Secret = de961e21573c694430280ec702db842d -Salt = 50e7bd82fbc1e3cbaf19d00a8b719adbfa2e20bb95ee497b40b73255b77bbcf48fadbd9979d48d041d4f1e3a3e752adc6d5049 -Output = bd9761c9f3198df780f35f075a4f7d068759f0a458d536f94fb9558341905fc8113c3f2f45eac696d5f0ce77b44a8044b2ca1972d7985e568cd7d95072146da8f41603d31b71 - -OutputLen = 70 -Secret = eb666301e2fec0d2508f5cbfcd31b651 -Salt = 9d7ad74a31dc3f1ef1823f8b2b94e3f6432863f933f1e2d8296bd52aff9bf8db222433c935c9a8a47bb05400788c2629d2dab6 -Output = 2a226bce6f29276ffb7c8e5b660925f66d1802840b045e74473d3614acdf898e381c7a13bd3f6b1087857172487b1fe9b572338c95f1aa18690d2433a6892ad7571bf564cfc0 - -OutputLen = 70 -Secret = f57957552620c08b0c707d1e0bfdc2ba -Salt = ebeede97adfbb23a77f63b6c63f19ebb2a736feeb88a3de84be02ea877af032b53cde2e79d24189548b5bbcb7ae6bb9f3a0895 -Output = 3c2cb066234438ed0c92215d7a5f443f2f184ce8956052a2c2f3ff2c3245bc4d10f6a51698c212a8f80c28cd05379f31a330946a4ee452448c70d29c5f4e55dd30cdc3bfa058 - -OutputLen = 70 -Secret = a8d9be46235338001d7cc490b27ade35 -Salt = affefae1b8274cbe8ac92f0251e6a9614ed4c92b438207e126291a08431aa7fc04e6d67b63a98be931b7351d0047cac72ca58c -Output = d80645282d72a0fdb45d739032db19a300c7f05e1c433c94427186ab20088de7f5521be8eb8097f8800b07d59096e4738234ea119159e9364b6775a94d150e91e7abb7dd1b0b - -OutputLen = 70 -Secret = 32462358284614397be76c451656dc46 -Salt = dcf5beb27073aa3596e6a1636562764e379aa842ad05e5becf796d2ec41c2aac0f3e686d053f7f84e9fe615cf9a658180cdfb2 -Output = ce9652f296b340582f1db0685db683c929b8f8234264455745ef5d7d00d44d57b7a3d3838dbcbcbee0e8b2cdd2f4ab5280d856e640e35dc59140176de1ffebcd99164f3e5bcf - -OutputLen = 70 -Secret = 2f76aa411574a2d048214a019d7d630a -Salt = 8596850113fe85b67588b7b263b205f883de818a12f85a765d63eabf2777a6077026fac9d2e326d9b0956f1e8e55ebb52c6147 -Output = e30ed7713303430b004c1bca4063c5572ff8d4890bce5706b9b93393a29e1d4687d577113a2e3b9c2249cb73e5da4d7ce18dafe6ed8901380b3c8fa882a4ee54f8739038370d - -OutputLen = 70 -Secret = f2231ee3ef458786034968384d702f95 -Salt = b54e7d60a31be20052335cf71a5193a99b2c3dbeb86cd5b25c6002687368abfcdeec8c3c508d90ed125c4884967d2dc62a3e59 -Output = cc8f6abf23c747b8a40ce57adf873358531f2cf1a0b4f9749a51bb3e8f690dfe8d0404c6b8d080e5e329eaa5fdfa9aeb283195caf1881553d21a5bf960363432b4b362ad1924 - -OutputLen = 200 -Secret = cd48c2e8afa03981434936adc8508ff5 -Salt = 6ec762f44054f3473c01a2f3d8b3e20c1180c8ab589ceccbe346d7d5b3e421191c2cef7e429e9eb4b0ad624a933c2c3a1bc61b -Output = 43466b5fea0c260e4cc91f94b628387748650518c738619255311ce978b92ca0c77380afce210e3cc8aa88f624eae09af2c56757161c8ba2e6429f62f60a38f7494a10b2f242a70c5d887213583503155c13a25642d4eba73cfd8163be58fe1352a7d90afca5c1c47d52aaa835062fb104feb36c20b323612c44cda499980debf54e2d7424abcf71629543edd8b39b6bd74aedb83dc73cbe6522d545a4f322a034839315f59ea050a7526966ca4cad6a36cb54e7697eade7a6d953e3f7fcdc4268edea6e17253782 - -OutputLen = 200 -Secret = 598c2c34130281e0a93dc2616a9084d5 -Salt = c517fc0ab13ecb3633c3e677929a0d223b9de487e965f21ef4d3fb110936e6f855d6a2a9d6390d4e768529cb272ea27a8c49be -Output = 9cd19ad627f874d65bd6b92985654cc338d91cf21b31cc028ad238540449ea328a9f3b220dbe1dd15a693de706a9fc4eafacf02a02e579885256e22e33f3a0b0609ce6e4f84b41be373b668994ea2141a30c1613930daa347ab7eebcb24655c1fe0ba3c9debb273a938879d9ac2d8e0e8a47d0098f1551f55cdae65a50d557d77fd882d1ab443287e14a63aea9d1c1cf33e539dc8732e7fecf947fed4a14c40b17ad698d97e9b8c0222a279446b8c509ed50fb9ca1c9d43b17979751a7c711a717d417eb8a8f1c97 - -OutputLen = 200 -Secret = 8c4f256ffddfda56d7e67b3cae1509e7 -Salt = 8a288c3f99cee598756f7c577a296b1b1ac186f8ff14ae727796e5f77b0998785a8ff5c9db9aed670059038588da75b52880cc -Output = 2af17b6952e4e56a2f5379294cb7fd8f377fef86c61300cfb609001b5599e390d19e71cf204ae68ec9825e59ca0c38e30a49456e12426804ef180828295b9ff301ff7061601e30b774212d2dabb3d5e26a1e826306e3e7c9c8d3596fad49fe06f826b9c01be5d91d19e27b92a6c0e57eee4200f87ad9141eb2daca35686381f07b7827ead72d709c9f46426d9a880d97d865b215e2d61f3912126884d8aab656ca8080bdbc981a5ab6a3eae7638c427941309ddce9d9c6a0a4a06622e94c36939a203c76f4f1a449 - -OutputLen = 200 -Secret = 476cbe56dff791bcaa02451684d7c8a7 -Salt = e142f5e5c909b3f2d2f7f09a30ea513c887a807ca6ee05419c6983ffee48c080cbdedaa64520e9c36cd1517569df372c836120 -Output = 9d88a0a2f5513d73d42ee15ef540d9cea7dc0b4ba751e081e2a115208adaf52fb94229b4651dca3da7c99dfd768eb60c2155a5a60e1b75d7c2602b39a233df810f6dc21f2e41f5540a69c5350456e4f03a5b1e4f578765286c50717849ef6cd14cdcf6f2c29e795831259aa751581b328b6ac8d0342497d2be1ba4d2ac9abcbe79329eea4181368b06a9d77fce21288d7b1f0d6db07ed18de769805640e4eeb6a27b7df75b7f45630377e6285f2a0b88f8fb6e2fe4e5612491aa4829395a74393c7ac054baa0972d - -OutputLen = 200 -Secret = ad6b4b5f859ca3cecd271d1d476b0f27 -Salt = 3abe1ff742c720456eb22faa550797ce8a3346f3bdf58e40f15bfe543ad0c72bd05261cd6ba4b1a68b745bfb617a1f0f8387ab -Output = 9a0da9ccb64b5646322edcf2887aa35b875bff45a28d6837cd3b9a0ed6935984e2b2a3c54867ad8521c7d98fe85cb6e4f0b1d0b65d1c268a6167bece1f06537a31bbb1db2348bce3be8654933a0c4bb7ccb37824e0b0b3bda9ae7176de0c33f20a009cf0b8aecc1d2ef272556e0450d6c60a552640e67bd9c991ac017e1ba0af8845eaf33dd86c0a6c3e491ad83da3828eef5b460e4fcfc077fdaf7c990108ae6d85a3371c641ded398efa17b72a07ab4c866e615d179c3538124ceaf9935d9299bd7c5b65b85ad6 - -OutputLen = 200 -Secret = 5510301f474f74329fb34ac516841962 -Salt = e4bbbb8e805af63ead9dc01f9f842ce6f1aaacf2156aada83de0b6fc5712e3da3b682fdba9840d46f6190c1e9eddd92833f9f6 -Output = 54edf08ee17989b99c021643ae15c2c9a95d94a358354547ec24fa171ebf4d0a002ebcc6486f3fe9aaf3388a35583d4579564ee4ef03a5658d6d91800adc652c3cb76469cfe5258f297c63a7a842909f7a92b9253ef8da0200e4dded732b0ffa3fa88c7439d56a0883e5e49eaceaaa3a7b023174eac3b5f179bb29239dd79743a6e824c82a3d685af7e395bab005885b5bd3e5ad75cf97ff81fc1a856e528fa95ff46fe2076d0e18e73227147851ee410e29b918aa512ffce282f3f9673638c38e829d3bbd329af5 - -OutputLen = 200 -Secret = 13c98559bf98b541e57a697620545638 -Salt = 4537c4b6ab9a997fb398e0d6540dedda3c4d6ab9ac3cc49a84e032fea5b01f1a8d0fe9efe23543a63c04105955c604c81179a1 -Output = 58f21bf72fdb7f9e6958887b2990d86010882598d32ca4a24b08ba6bd5fb19aa8a6e4b78f32f9645cdf35557c9e08cbbac1d3e2d220da4a8b01019003e2edd0629faa63c2878295024b3771f0ab3f42d9d316eb4ddb0df529a556dac56f9ce7674be537ced51d699dd01f3c724fef81b7c8c48810283002e52c78ad8759aad462ebfeac757c20d83b9d05406f92a4714a9b5b2fabc0e72368177342da3feb496e0cda087719fbae574a3b124eb0346774233902e75b1403af58faee127fc3ba24bff0d9058895c76 - -OutputLen = 200 -Secret = d1b840c4ca352f27d678fbdb8df5a224 -Salt = c807ba6c900693a01310d08f9e6f90c43fc74049f0a9e8e846155b2c842584f7feb512b3462f6e9dc020587563c1accd413f6e -Output = 0acdddc2a0b00b72f2f515a36ddb4938060af687ca5ea1f82f342c2fe15e073d29d4437fb19803a98be43b86fdc26c3786e671ddac3181bcc5c060312b7cb46a49d4ac8b95393a2e22c38df8e0b5be12031300b85de409a0801901ab9ae5f68c8bde1a39ca876a1c8575dc02ea04a68d80c5b676b91997c039fac6112ab72e1eb40aad9c6f5953ff0784fe1f6556788ce8f239ad77a7102b025254a90a90e0a6a9247ac9a5feb67f4efccec0ee00d2fe77338f6d4cbcc9b3d42e79c1a3b24757199526056d21467a - -OutputLen = 200 -Secret = 66d16980e27dc279baa2f305bf8c77d7 -Salt = 20ec5d39b900e72959aa9cb1191a79930bdf0e7b11b30664aa814c1e38afa58246bbcda9c0eac2ba790910da9f26ad4e802bf3 -Output = afa0c66acd3bac49ef511e6a7a13f3671482113db5f6f09b429cdbe3e1e58760f4c10c578a24dc72e9e00d141150b839cd1b6e5d54680060281f030b40413be8258fde4551c5628a5600435d70f6276ccc510633091ac22c11e8f3d5a5c983307009274c4f3b870e23d88c2e58d27663e484c2ff444a38e4265fd78036a2688b7cb55ff64c2a9dd96f47b787c64ec38eba9679d23af044dc6d3d51ebe18f17a4bc4f61f4c976db1d28432c6fe929c7d06168baf6552e971ad1f8f0befadc2063c88905812a043c6a - -OutputLen = 200 -Secret = e17e448251665b3e428285b0ff2a0c8f -Salt = 14049682d60fe93d7f0ee6f9066920a5ef8122faacbd874e2512e4900cd85c67a499839d4ac5581a91ab3ed62c87bcde02ef17 -Output = bbcfc36985df51d74f3845988641f004da9d5281843a19d0c09b4193eea3b47f9d6706b52b914b2dca703ac07a43705b60eb0b11d02e3ab6bf96520d9233ff18bcda04bc4ac46e6f9d2b75bbae2e61941080b09bfca0ba196480fc425cb44a83bc76b76f7b495e08279ac66ae36305fb8165f950d7db2c2969b83ba126e02012b8f634dd313830d6ce5f12c9992e24b03fe42365a1acafc6f3d5028624d0d351ea415ca22d3c54bc293aa6edb5491bdbdd0b2bc660471f6679d7e4fb7ced74eca513dbf34e4748c0 +OutputLen = 2 +Salt = 1075A3E96FDEE1F81804 +Secret = DD18316D16F3587F0E2A30E3FAAFCE0A +Label = 828F91C78AA3E857585F5E4C +Output = D5ED + +OutputLen = 2 +Salt = 5BF9219CDEBF1BB73F15 +Secret = 5345DE613E50A21B3E180BB4D7566FB6 +Label = CBF47100E1CD2FA239D7A0D0 +Output = 8284 + +OutputLen = 2 +Salt = B9C8A441418DA9AC840C +Secret = 366F061298B626F9A01706DAA543A2F1 +Label = 3A4A8FF2357098A62B676D2A +Output = 9A15 + +OutputLen = 4 +Salt = 3F3C00CAB020675916BB8F268111EAB34C027A66 +Secret = 2794F3B1253294A2FB9FDC682A2524B2 +Label = 1710C3F22E1D6BDF1C12F48D +Output = 6E75EACA + +OutputLen = 4 +Salt = 61DE975FFAE460A92ECE20FD472350A76D77BE3C +Secret = 907DBBFD363D8649B792D0185E1AFA85 +Label = D3BCAE922607D1F7856013A0 +Output = BF9EA51F + +OutputLen = 4 +Salt = 29922D56C360B33377C4FE28A7DAA681BD2DAC68 +Secret = A87EECDDD9083620D774B4E685B7855E +Label = E50BC02D5A9BB55FCE042E3A +Output = 4FBA3FB3 + +OutputLen = 6 +Salt = 7F5025123428F547671DECD06FA1AEF6EF7F545DD35D4BF5F4040C7F8A10 +Secret = 34E09A66EB4DA4185FB99A73EDCC17BB +Label = 19449620A6A8EEDAE976A697 +Output = F8ED77474ECA + +OutputLen = 6 +Salt = 0FB63C8D75FCFE302CC2ADB9BCD6D10EF76606EB7A5740DDABECD926DBC7 +Secret = C5D78318156B9D7DF26B2CAFA866B070 +Label = 9576EA8FD324AAC88AA24617 +Output = 07EDAFD0AED7 + +OutputLen = 6 +Salt = B941C64B87D1E84B843597710D3AC317B419859063C7D5EBFB6351426F24 +Secret = A46D76207EACF0508AD19E12BC3553FD +Label = C3469A1AE2A5B574A74289F9 +Output = 6C20AC298058 + +OutputLen = 8 +Salt = 8B1115DDEE1B1677B856570C26214F25EEC92011AE6C7E5DD786BEA1A8E0E4641EC3556C634753B6 +Secret = C565959934397E0E4C3C8C0800D81577 +Label = A546A25EFB81E7990CBE0FCE +Output = E8D844E84AD254E6 + +OutputLen = 8 +Salt = FC1486BBD67270F100645660C7C8C2E199A63723CF80B50D92E0A2A8AFEAEB89DD95F51CA5133588 +Secret = A22F89AB441A96467E6C38728D05AA6D +Label = 07E3A3A9084353BB7BFD910C +Output = CB7E39370A81AB24 + +OutputLen = 8 +Salt = 939E568C4ADEF163851AF9A8E37293867FEA196D9202EB81846A84EAE712E10588FEE8D4CA577EAC +Secret = BD6F4482F44E8859CB018180CED4394D +Label = 20A3CAADFD8A0E28FF1FAD3A +Output = B256A1C2AFFB530C + +OutputLen = 10 +Salt = 8EEAC9B5DCE7199B501F57DBB0FAE08DC7DECF2516B4F3B5230EA3BDD7A208215565EBC07B75EC3DB08153BFBEB0B417D2AE +Secret = 914AD9AE903684F74BA8BC95A3D51831 +Label = BDD6396711C373859C2B7B9D +Output = D6DABC916AEFC1E4000F + +OutputLen = 10 +Salt = 1A77D14F9AD202BEB5A5B6EF1DC6FF15B9915877FEE9E8AFB6F3280202EF8A24A6666928C074BBCDBE002D78B35A91B2296B +Secret = C552142CF5D2130A88CC0973EE9755BF +Label = A65E4E921F3F610BC25C02E8 +Output = BD26A9294A575662E765 + +OutputLen = 10 +Salt = B1900D9212C0765309E38B3FFC942DBFBE6353185EE0E664DC4E66CB10278AAC1EA0183597BFB5D2C5D429D8A30EC925D3B9 +Secret = FF300E8F348A463AEED7E50F707E6FD1 +Label = CDC66AF089816B960D1F2F75 +Output = 5690FB1EC4C0AC02D765 + +OutputLen = 12 +Salt = 451E805C831A1AD91D8F6871E6F09F6AAE3063496C90EF8CCEDD5CB5DD10D0128F64DA80BE34EAE01230DD9BBB9F252EBD754D18BFD80B37979FF712 +Secret = 7E17088690D26A7B5921A0FCE9567E41 +Label = 79533DD72C3E9D94262733F3 +Output = EF41568A483169C3C9BC699D + +OutputLen = 12 +Salt = 164C384FED8BF25BF9D3BB626C988330718A0D7930D4FD3D0CDA6CC689FC654F6670F294B39BF346AA88D22AB5DC7B1E41D7F1F265ACDD7C93791708 +Secret = 0EDB7439977D981E5587E230C7ECEFEC +Label = 640FD56A73659251531E7BE0 +Output = 8F341AEEE472CBBCBB9B54A2 + +OutputLen = 12 +Salt = 5933B28485D87CC34D14D6B5F5C2D2E41D7A2EA19B9AE058D4B55F8F1D6C92A7954B037249EF88ABAC1D8B49CA21C7EEF15F34677EF01BF315E6722E +Secret = F9089D56D9A6C6F6BCB9992D1896510C +Label = 3D45EDB9FAB78B295AB5B3CB +Output = A2762C4FF7BC4D21E5C25245 + +OutputLen = 14 +Salt = 73F7CBACC851DD112B3C59FFAFEF864BD7BD86CA7D5B60DDE7EE19B7DF9EE5B51F18BCC81EDF0ECD9E81EE999E4EFD5D771682BE3663DBA3F66D749B1F3C38340741FA43101A +Secret = 659343A9A868A5AC8627FAAC2C8BA5A6 +Label = 22BBAC537879FC1DA5BC9EED +Output = 21385079A7F295262BD2B89444BF + +OutputLen = 14 +Salt = 7446992627E11B33E86C65A3775AD85AC23D66FDF8BB55CCF765E91FDA26CB9C9CE685CBF827634B4FCE3AB130BAA1D987425CFDB65C85F3C48FE3671BE970B61D2CEDC1FAAF +Secret = 842E659C36E9CB1251D155ED3F4EB517 +Label = A4D8FD35E4B835C6265BF86F +Output = 183BD78E6E042A95F751E7AB2DF9 + +OutputLen = 14 +Salt = 8FAAC1C89F29AEF341408485FC99AD180E0AA07F7E6FAA1F61639214617180DBF338F34F3894FD6121A381E332A94A95D055821D4F45AA2FA962083CD634D204E2A0278EEACF +Secret = 9066D2332F136A0259F3A3B72338ADB7 +Label = DEF6F7F5486DA5B30452A029 +Output = 58DFC291222021249E5DA028EE16 + +OutputLen = 16 +Salt = 673858C0ECBDDCE03CBC490D2EFA945B473F0816FE10B003C707FC01CC671A9A1534658A83000F6E136E25AF619DACA7D935D9D8705AA91CA05730C48DE0464E2BF907135F83759E16883DD5954F5084 +Secret = A5FEE6A78FCFF429D15AFAD018C63A52 +Label = A368ABB6A8A5030BBA404434 +Output = 98B76FDBB4E5BBB66C326EE0542D305B + +OutputLen = 16 +Salt = 7CE2E6944332CDC5357DE7B232FD7007933CF13970EF6706C0A3CEBDAE8FEED59246D2AEB7EDE3B676263D165488364CC6FBD7492C79BCFA1FA1C5DD73536B68CA498EF1E2BA28ED88BF648C06A73E12 +Secret = 8623318122B2345EC46B29DCCADE7BAB +Label = 23955B01F126B17F0F709A25 +Output = C2CB1F5CA37491CFE53FA26EE0D9563D + +OutputLen = 16 +Salt = 98A3FAE45C32D56127A360E917589D843B9A3A8E54BF6D8884515D5B7B756064976D18303494C2C80BCAA4A41CFB3D1990396FCCCB34914618650FC20DD227754576004278D4740EB0FCC8A0A03F616B +Secret = BBA9EC0710320EABF1D88B07291E5AF1 +Label = F887468F595E7293D3E48232 +Output = 0437F7C7F49BEB65ED17660D9CDF5C6C + +OutputLen = 18 +Salt = B9B5C1A0B5AC9C9D92003060AE79E07D2182F06724FC81C22265BAD0BA74544122418491D3C5602143D7B253D5D8D8339ADD8D1043B024A4621F2A7E16DBB441694B03E96A0C040AB39F9C4D1EBA27C1CDB0F3C7D42AAE82D265 +Secret = 61AA99FBCFABB6F664F78A5D47B5CB27 +Label = F9B86CF85016155F1D132D08 +Output = 733B4BFDF1DA833D848B75064112B91F9574 + +OutputLen = 18 +Salt = 11C7E0E0B837859584ACA19E39503B464CC4CFD7D6476F17291E49E98A62C2C606AAB03D96D922E1E663E21FCE89A4992FD414EFF39AAAF002DDEA1FC4376325FAC75ADADE116843E1DCF9BF2E79A3FB80C2121B9B745EACCED5 +Secret = 57FC99B324617EE7F54C7DDE15BF759D +Label = 3F27EFEBFBD1FECE77637361 +Output = 9D765431C510792D6DE20DB4BE1EF7D27618 + +OutputLen = 18 +Salt = 295AEDBD3062E88E9F039CF716505553D6027F519C840FEF83C67F943A17F40E8CBD9C62E26CAC1B07BE4F7A4978F30E70C2DC225965D66C45B16F89794D6ED221EFD2028AA0DC43EA9B47BBE5C9FFA48760AA3EF56436EC8743 +Secret = B0E3FD5B7ADC18E22B67FB942084330D +Label = C42C1E0DB85560851A666822 +Output = 1883292E2F0A6DFE64BD70C702CA8DB2D4B0 + +OutputLen = 20 +Salt = 0BBE03778580BCD4A0E07AF050C9F618ECBB393CE5155D18A1BFE59C7FE07593F69726B42791AC7CEB8D32A76B31344CE0D5FF8DC46C6A830C8570EA9ABBB273F225BAA04BD30AA5F8905EA09DE70F3A9AB36BD072B22CC6AB102597268F4146A3FB64BB +Secret = 3ABF45E50F22720EA8ECB0B7307CD917 +Label = D2AA7461145DDECF16B1C257 +Output = 7F8FD9042E6ACC8D93A08EA9534C4D979F76F2A4 + +OutputLen = 20 +Salt = 332460B4883CD00D59A5A96CDAC5CA6DF755DF048C178DF4751C6A65F8AACDC5BDEFA820961C69B7CA962FFB10750C90928E2A374C79EAE45595A69201507F4D92292B671E168C79E7E5EBD7A07B2223DF2EF8642B30014CF45C90F367EC654D87653B5D +Secret = 5C81A99308EE6A6B917DC84D3B452ED6 +Label = DF355ADA033D334E9BFEA26D +Output = 74CB681081E0C5DD07E37D095140E1F21D8C5A46 + +OutputLen = 20 +Salt = 93EC8DFE0C5C9B93671240B61B561BE48B0E9F8E61266FA4638EE6D2E976DDFBD8A1B709DF4748F49D6B0B836E9524FB3A440BCD9B9E6C383FF8E2DD9F3D43131DB80B632E1D7D457D81C8401CC3D5CD9A849EF9F3EFF6695FD6DA177802C9E59DE6314A +Secret = 329592EADE124AD1F9D0E6A1E41DACD9 +Label = 69791B32D705BEF5F408838C +Output = C3D001DAC0524F11203CB67EA61837A135888B3F + [SP800-108-Pipeline(CMAC(AES-192))] -OutputLen = 64 -Secret = 712a8778be792bb9d4a3285d165b5df8ff33b98e4d84651d -Salt = 7b07015933b0ad7ace0f51df1b047e11d8b0b4d8f43903a1034ba340269254013faf80ed3b9b6c02003c01e64aedff1f86a703 -Output = 45308cf8e0aa612c130a4dc3050353da17174cf7b50ff2a43187ee41bdab27c27e55e2a3b6611e0780c5a328a4f72ddd951bc47c0c53dae9d52566f2869ffee3 - -OutputLen = 64 -Secret = c98c1fa8fba7a856fc63755ac3caa8ab80c1eda0ef92dddc -Salt = 5febdd0c319196a1b832251a71d8842bb4cb8c67a04adf912d81d87ccb72944e638cc4509c02929c16320b8f6c583a4a3e0c08 -Output = 1a9f0c32fa9e0e35ff9368418c4fb08ca4ba749556eb0f4b53c08d5128fa7dcbba682d3656a86278c707715fb006e6a11812634fd2efd9470ae39d6fa2f538bd - -OutputLen = 64 -Secret = 0e42a1411de051f5d4ba18807005cb4a5468a030ab85c6ec -Salt = c636dd7399432dc14bf628ef1a8826bc0b0f2ad3291b2f8d6c6cccafb93998219b15eeb654005dae6f8a2182577c0202eed1de -Output = 9d4cf834ae11f6741c9ede08f556b2199adddadb30e81199d17df16faa75caf8a71b334a19f2b19dee2cde1e5989b3a705a5c0c7bd9c5b4e4e76cd9a5927b7e9 - -OutputLen = 64 -Secret = b9cb92597fd93f5c1cc81fe21aa21f3986f6a2005a5b5572 -Salt = 2ea79a3ad4cb2d727b42e5de66fb2d59aee938702b49828b3d23c2dff2d70f8a17d8562dfb62464aa1351d41ea8db7d129d677 -Output = 189d20e6ee69f757454bec870abee379cbec66fd1674db21d6ec933a3cea24d2eb2becd864a6748fcb5cce64abbb05a30b18d48ca9ec601587a3aa6f72cb0187 - -OutputLen = 64 -Secret = 92cd4e0d200dec738d84e5779353f7bccef5304a216966cb -Salt = c1dee3e693f8b918b63d0aa10ada8df72860359a760cbdf7713cd38a264787b59fa96ceea61db805b8842f450439286c366499 -Output = e2352a0b7112f368f470c23413059cc0f823c29e675e704ef655ac1f14efdd3cac1b3939912e77fc41114bfb3999b13dd1890de5e04a11cbe0396929f91a8d6a - -OutputLen = 64 -Secret = abe8910f920ecd90ff8ea9f35fec8fdd187b56273a0ce8c5 -Salt = 3b477feca049bf0288b95f81314edd9825dc71ffebdbc9fe9555b7f1219f456c7c8d9cb3014e1b0165a9dbc7ee74839f35f2af -Output = e809aeadb83fecc43211cebbe6c42ba1594c0f853f0d204cbddc1241ea34688578095f7a7d74426791cea67576f5ec0706879f7ff25a199a25538956d8760fb2 - -OutputLen = 64 -Secret = f938d94579fbc5cd23c492cf5802dc8640e6ab44c8f5069c -Salt = e03fe5d8363cbb5ddd88b683ad7e36b12be3423bbd290285b49f40ab8a1a9da95b6f3b1e37ec647084de838b05790cd6dedda2 -Output = cd6c9bff63fe9b5d06243f30c81bca8a8111585ea36ad2e605af09fe19333b9c9addf748cbace7ecbf034f453f6d2423801a8bf7c78086854d675846e02c433c - -OutputLen = 64 -Secret = 12a02b16b13e3e26be6c1f5f7ace3bfcb29e6760a6ccc38b -Salt = 48f1a2c0f49d7d8df80ac5621ea432a957f2a0f4b855478988d5bf8081059d6e20c108c112b1345057b828cd462dc01f9c9747 -Output = 22c902a7fe5259f48c7e430245158e3de17ffbe2267ad7fdac5978170eb7ec9d2878e2f173398f5fbf091400d009eeff5abc7861661e0f63a1687c3423c2262a - -OutputLen = 64 -Secret = 7a26c698e9b31088b4de4ae765beee5f0b9a8eee13579caa -Salt = ac9f37a8d25f7d89cba7392f99570574bfcf104d47ff5569bd88ce393ebeffaebd61063722070882483be088f4bf13b778c830 -Output = 5803556f87a9abe78477382e98dde2eac307a09e70cdd9c398b2662c73cbcfe120555f5ad65c17e961a0fc4f899de55b03042c6bb532620e7a64a3849168a160 - -OutputLen = 64 -Secret = 65801180fdfdfefba7ed14a22701fdd2f155375cf619eb04 -Salt = 3fbe80297dd11698f51a02c7d50b03ff6a35a35fe78751024da7f92f112722cf89e2a79646383429b717026e9bd4419b1d9262 -Output = 04b89c7de957523ca0f17ec1d0246cd4ece469a568f6009a33cd1110c9f94a98ae287630aeaf88f9eaccce237b893bff7a9685c47835e1a7225ac49845e3b455 - -OutputLen = 256 -Secret = 1edcbd9f17719a99757e8e1c96169100bef6a6d07b7045cd -Salt = 255d403ea7974c0678f4a38226673213ec60dae49f8575ae0f25c0e587a41343599bfe85fbe77031967a6ba9d55fa6d9cfc1b4 -Output = 54fe19ccaf620f40b47830c89ee24f54d3844588853c7c4454459cbd5e10ac0e8a4a9059f33ecc5b0c75e0579a4a25c33d16a2f62eeb1b84748a10f15c4dcaf07a28067e8b75e6fe78efeeb5e1ed1a6de4bc811d42d04fc6c11e06335b311714368212b54f22144e4fc538e3ab462f1188cb7f8e544a2d92f4d25e86382c81e86cc7a4752ccb44580bb0d1d96eae6f12863a4312cc1cbb433a4caaac686fb52a3015c4733072039226933bfcc06775f00ed2c2c24087bd05d39c49bab89b76079d495c2c1685157db64a2f3df1a10e26e53d29f00c0e82ddb8b38ee48d93fde231a1af9fdb1a964fbf91faefe78ce5b8fda58e8413d6c1506e479c78fb0c3e2c - -OutputLen = 256 -Secret = 3fa2b4538dad494a1b2f62b93b7a54222e051d1fad8bbce2 -Salt = 21841229223f85ca094a9341edeb629adee9f5cc4220476a0a43a5bce62c0a5426b6f992e50fcae2708a09e3ce1cdc737a6ee5 -Output = 9d0a8aae138b26ab9f5416ee2080be6ff23a65c20d2dfa9bdb3463d1bb0a37f0b43cbac4c369f7135bb3ba8db84e5dc7902ca2044ad78b5242352bc268e87500eb0f7e4e819b5229003ac91d875ce16237f84fcd780051729d58ed81d3bc0b3ea9bf90976b8692b6d132be01748cacdf24afc77020195b023f95140ea925df5cece7d208a3fd1fbac471968270f2cbd70e8ede9770d763aaa175a0cfc1146284479aa3958d014d277aaae3c7a306e614de3af2a92e7b04f21639cd1ebec2deadaf98edbcdae7d110ccef810f31b2858a0442ee3298e61d83bdbe5c64420ef24d74383765f0b8a3639a52cdbb8261fefbf03f27e482f0e24be3b202aac955cae4 - -OutputLen = 256 -Secret = 329cdd155f37ba8c3d44b2e9abfcc1173e52dd5a71e5ca1c -Salt = d7b210ff80c43489c928234f0a0e02a3614f44a52aae394e62314c74a24956b87bd7fdda8cfc9d60007f9e1a550086e2b8f2fb -Output = 8934b60c7d0ee7df2dac9defef1ec725b63106bab24b429a6b2e87d037923d266621e5e892eb0f7002c85666c3ddc61ef7a4a22d638a530a6c90202f7fe7181472337af9f8d36224ff0b477a8d078c36429a564e455401b7fdf978cfbe1891dbf8731db2fa7541b46d32e977c83dfcf28ee2219363dca7ff5b21d90cd0b1e16cee8be5a3c749528e7cfcee8a9bd6565cdd2e3d7a3d461b89e5267c958f39d94e51ae4be17ed516d088fd4250eb62b50773edd37da0735265dce42e24fb272376e0322966e72380133d890af5ea38a18913f7d7e1a3cd02dac953ddad5ed3c97b504a796d3fab81a9fc5107e880fe19d7015713a401460d03b9bfa7db91ddc23b - -OutputLen = 256 -Secret = e991fe96746e769ede6d4f2edf651894f8034733e18d5323 -Salt = 6f8f91d0285a5140d372010226234daec79d67d36acd8ebb882d821ae31c6afca8ee40414a10fadaf458ace81341f19411d4ce -Output = 2f1531789cf46f074dfcda88f7b98560859485b8f1346ac6f8a593926c584964548eae1dbc07e8dd2b7250820b4c83ed25676bdcef5dc6066b4a9e0c05f1b638a62aa33009475adb6a59b6f7a438f389a24e7bb1cf37d80103e07dc55efd4ef8d8928b608b19240fc39a12892ab063633caa528dfa2bb9b60d44600b2f539b30f1cf911ee522241fb335c00f1a21392049702d0e3c2c6343f9077c44996107334026d786cfe0e39cfe485f55357b3c2f3cac55ffa49fd53b4678415c47e33709786518b38c90497f524fc5ff63547eaa08d356c3ae74f75db4acee24389bba5e510bdf7b278a76ae6ca9e57cc0f3b4d70c837a3f5e1e2a7d58aadedb7d9fcaf6 - -OutputLen = 256 -Secret = 73d9d2bfb3a0e24de5ff8491f6352b789a8b49898db3893d -Salt = 753a6f00c6b0e862a93ca963eeb3bd87a5ab35a697d2560f60ef511916a6f9c4bb16ae49cc176485526788d6c9264444fce478 -Output = 0da55ee2f07dc2b4c66ccc5cf9a0f8d608d827588813a84e6383c58bf234083bdc643ad19a4a22ac93f43246b093c01d7156dcb5181746325c469db83d07ce4f01734f0ee6b38b9fb13b4dd68b6c5c9bfcd46c7a009fc5ec6a7b03e9ecc12c9cc9a4c103882800f2daf854cd8abdf9b0935395063ef5301e2ea2946f3dea14e6f557fda1fb5a8065c643f5dec28983baf75fb729a60d30d8ed5f16e2fc5bbf4f4f92969d9ac0d60cd1ae6d1ee6f84bbc554a8f00e359558a932dafa8aeda5fe519c462d7263805801d54c468e0ecc953b6fb6ce764773082c0f8139d67612c9e49982214cf33218dde4a0abddfab4448e1dcf39d251baf91efa8aaff578f7555 - -OutputLen = 256 -Secret = e9ccbd33f624f893a0beedd3eb98ddde6b9ceb057dc42a30 -Salt = 25e2735c1293a8464cc9d536fad0f9a237cd7fec942cb34f9411bd93a5a6c252a8e7d5246d9ec54996b4e3753eabf8e6958e09 -Output = 33d339a055a13cc82a0bdd757552a84b73db87bd44dd8b67fd94f6a08a804567eda34aba2fd353f78f55b764e0238a6a1918c6fc0ca77dc615c04de568c7d2e925336f27a8fd19f5090040f5ba1b61ff483a86d6d75d1ff158ff6259b486c886c622a085f6081d0c5c1f6fd3564bae1de365a834ed09b5f4bb3221ade4b37389ad853627477ee650837c8b4bdd800bb3293202233ca9c5db13c72023cbf5184a5ac5f540d76fc946c0a7f8fb6e1f1bc9c88b3e57881a5f072223d3066cc3170dd6eb94d9307b49a06f6576e3f7d7a9d2ae5884fbc853839599147c0e20c5a72e3a2c5d43d7e4ccd4972d95ef5648f335935667250a49fc77a147c8647e332c36 - -OutputLen = 256 -Secret = 430ff5b5b7d5fb523621dbe708c743ee7790c52f988de14d -Salt = e1ad78132e967287ce78876e8a18dac71ab794807a548b3bf95b237ef7dc3d73349ee2bd21ae4ed126946cca19d9f9f019fec9 -Output = e7e0980be36e94d89ac6fa81601493b36cc5d2de0a0ccbcf286f5f03f8099f87d8af351b9221378024e735d971bb9b1218886bcb74104fa76f9348e8c8ac5d452ab467936520fd5d4a82d8c667d9f3a2b8835e0984b9d46991f9968e346d3d52aac8a2c04e918431f3b2e3995390a681eb3bd6a5151c1ba8b46f40daa99a0305b5755d427232ddcf4897efadf353b920f9b69984ab2b1f1c87b7daad0a90d1415cdcae7999aa8ce41228d7ccece40ad52074e4deed750bab7ff1fc41c1a07ba4a24657f99b53680921797b75584906ddc031ed1d364713a5dabf1dd8cf42b43230a8f1fcb34289fd64162f6c65f1b9f6b3089fba5066613bdec08f8085153409 - -OutputLen = 256 -Secret = 634dad68fc0671c555001103c1e5c761f5650f21400df7ee -Salt = 82adc86f0f8f59f6fe5c7e1275ef305fe82f1e6c1e53d7b96be1eb6a23a8a7eb4fdb35d775adb88221bc14d55832e8daeeeba3 -Output = fe87918abd8170da9b3513c1d8bd5be97ced2ffaf49b30e96b5535c91b5fbde3d7c9396fcda4129d3ac6f1a57624ac9f79b443e3d6f092bf6d9d28ff27bec219327b7ea46321bd4102bf2c947b732cc542cd97ee4b53f65a00f8bc09805305df079e94686793a54c08704cac2408c1d54d468bba9e95b45e0dc73e2cdeb9f514371b5de0890be72a8513a0870981cfd5aa874a8d95d388a4ce26e05bfd0aa4383a9ac3512d9e4dd6a1df410872584051ec7bf09ad72aff39f6e661e314d069551b3bb13276adba9b117517d043b311d08cc15ecb58e79aed6282123b4248d3ef8f3534b3d2c2e1c1e62a0d8b8aba32ec9794d9ed6cbb89f352d2d46cacc67a62 - -OutputLen = 256 -Secret = 0b4928d8ee48adef8e6d7b716173900d448c12b335e0bafa -Salt = 1a28d9a5ca27387a8f4b1aeb5e3edc0dd8c780f0aa941d93e6dff68e81f01613c93a5faedc69b778874fd883739a1f236ac0cd -Output = e41c5a9fcc4c69c89e42fef0544535c6da4fe0b7de20954d8274ef82f36be28ae1e2a2c8853a171fe004cde1afb865c1063dce51f9e485ca90bcdfe0bf2aa1fbd29046cf007a163f637826063b03010e81358a9eaaad522c20075761d0b174793beba4963cada0843099b5c6d197f0320c9bb3a7b5e7e3646deac02754d02c22fae6accf5b4cb4e1cba8af01e927fb49968e86d85cbaaa27a1ff2d1eecea455722f1bca24ba325466e9d598e624daadfc0aa80e3f0f192e672c16d6f8417ee05d6dd1860d79443d095e391317ba55c34b7a989cb7f299f4b51eb22490933f0efc698a172de59e57c45dcbf5e2e6800763a5cc1484ffc0d0594f5cf024338cfc9 - -OutputLen = 256 -Secret = f3482b38a59b092f79456e186bd53343f05c591a3376d76f -Salt = 3a97bd2667bcb31156b2d296dcf264b095be5a1bbbd0a67fb56b82d311befb836100f16f2faf6473647eb0e8b514dae8247831 -Output = d794ed8e4b6bbd0fcc380af5c5f370cc3300f3776636e81d9d0c452ca52c91c66684e14606288c197ebf4c27ce26beccdae227b0f2148ed1617c7d2f8660ead3e5a539cf54c747bd2e1a16ac668b2c899a910d0462a8b00d77768184a21fe2eab9e2d41697fdc328a079f18b26f776f3e62e0a4a8035891536c8220136bc5ac01cfe2886dcb72afb416cd364ebf99a4ac9838d440125e5722858dec249d59d6956a01cf356fb4e0356f685cbf0435e6b27284209090013729186bc6dabdea8a62765f58184fb80495c10e29b66567c1609d59a50291aea263793dbe0c70ea1139a373098095a47e21fb733f284be5ef18aecea771c7b73f3081d5b00c7e39045 - -OutputLen = 70 -Secret = 5bd6a75d845164e2d335fbc3bdf222a956db3917d4fa02f8 -Salt = cc1f191c5788a265f7e027108bfeda9c79a2b9864ed17c4a7e0c08de3bc89b43972f1c76fc49b8a5a664ca9186795837704fb9 -Output = 657abfc8ab19d03849d1246db1596a06fc63e1f4169b3f1d82b218a9b88c0dc342cdb71ac256e8dca739a164f8d1a5a3241cf0b970db20d456a3257020ecf8c18ed30cd31810 - -OutputLen = 70 -Secret = 849fdc6fc24c774e0274e4e44fc217108771cc6fdc80774b -Salt = 10fdb49fb047c78534b79aa6f702eadd5f3665d0d8055755fb1501825e5250f28955277a9ce5427b5ee10ba6332f38f42ecbce -Output = cc9a86efd3bf0f06acbc9e3dd18654fdc54341eb9c021729ec6724402772c1015f19b20d76c38d78c0be60e38a4bcc4365c060fcaeea0fdc15a257a937a2c01f844e76ced9cb - -OutputLen = 70 -Secret = e7432b9500a42d636f06126bc38e7a4c86feb54d4e415839 -Salt = 9f6db8626cce8c1a7cfeba11df2fe7abddebce5e145295738c0c6af22a37f7923f12fd1b56196531ad5e728888c5af2578b64b -Output = 0643456ed25d31bf3ea4f1251538a7431d2332dda5dc2c8ca4cf686293f995915d9817c7b3df4876da95533001b71afa611711e1eb02fa0a10749063c80c8f88bbdb1bb7425d - -OutputLen = 70 -Secret = 056b0da0a585e3f602e92ec3d0761a3766951c7153d9ff86 -Salt = 60499381cd88405360326bd787b38b4e78fbe8be077b3d245d91afd3cf7e700e5d85ad2774bf0242f76205754e11377226dff7 -Output = d3620412a5731913afb9421fcf937213c9882493bd760ee7b279b87ae5815b30527fb0011dabc7563aca747478b645074bfd22c181e284863c96e65a3ac03368f81929aadab4 - -OutputLen = 70 -Secret = 8a7f9f47d451c0e8bb787a71e2827b7130fbb35d11374df8 -Salt = 02c8358e378ee9c298090905d08be3f9e8367c44fb744b00cf455b836c5aa635d1e91711e0e9b8860c339c2811d0e6b657675c -Output = 3ef386ba21c36065d4a0b2716cb02466484ab7862da15f7dcd2632fc7c4f7946bb93658a436dbb2b657a3f6f55fb0d1b1dbb87a669449830497b47b1f75e853a25b08c2dfdf7 - -OutputLen = 70 -Secret = 8ef691f64b814fe813729177b3901cbe31b751b3e438f13d -Salt = 3db6dca43f7e0ffd9acde48bda889fd669edea702c1c794ebb80084b6c33750673c4ef2eb432fc7677df0b85b6ce93961c5c16 -Output = 92f9a4506a47140501620961a27db04b31181d8db97f46bf8ec3d51becbf2b58e9e3fccbfd06245b15145384b28b35b3db03e30ca859046e9b9f237e5ecc6307f0887370505f - -OutputLen = 70 -Secret = 60434c9fb606e6f5d353e37d0874685ff0c19b1e9218b9e3 -Salt = 4a4f4e7e95f7dc908965024407a2274dc6529641fa54011fea24e966868e73fd2ddd9448bc727d1c8ff9e37124c3c333009402 -Output = a6e337dda77cbb4f2a82ac81bb7f4fc6a1c4b1078d55c46148506e4ee47c24dc418d7eebedef4b099066ced484c97f2800bdbd97f81209c9bac66e137fc7fd944b2eae75224d - -OutputLen = 70 -Secret = 7c42dcce2e2e80357bf55458677b58cf5d975f9e4026ec3a -Salt = 23ced8b3df0aab7ba4a0a6635ae0ee48910f90a048048e7ed68d53380be49a279672be84dfcb8508b9635fbfac41eaa468f1eb -Output = 38288111d3affda3b5b6e38acf440ee607cc0c2a49f41b059553eaf5a9415addd299b240d175445ff29e195d72db4557663e07fb20d050b8b0ac153aac1f2380f0fd97cec704 - -OutputLen = 70 -Secret = b37be7a90411ca59768bc9c2c83787eaee92d02fe127ee5d -Salt = 097a2d881cf0453290e94e424cfd4bf3429ebf76f5c3e9818a6eb956fafeb100bdbbb3f4239059bbc4ce66877fb117a9d8cc52 -Output = 39a403dd3262dda130953b8841af5011e9a0096aac693dd19b008ce350907d0e473ddd7f942e0e9c694ff2f19bfa5fafb920476a9f485197814701fa0c72a289c8101a61fe10 - -OutputLen = 70 -Secret = c9d4ee062a96a20286468e1af293e7ad6bec4524d1e3ba00 -Salt = cbe901d6a3f6af70ca515b3c51cfc9ad02dd218a554c231df80d12dda46c4db7a7b32fbf5b69073669cfc9257c72e79ce4b8f8 -Output = 71492d4ddb317d3c2c815c0765ebfcfc935eb8fdc4755a10dbe5cb4c09c0054b4c275efd76658c5fb26f48974e6e9a153f44c66c3cbf8b117d92607e06a76f92610e6efb066f - -OutputLen = 200 -Secret = 79e4264c4dab00e3a3987fa7f1a36a72305073d7181c67aa -Salt = 9d6fa8a3cbbadb840931b2caa7b37fd0e615bd060835da2f104c6fa8a1b84cbcea3b01084d9cf62ce87b2fd61cc0356bf7f7cc -Output = c26ba2811e141e0afdd3dc6770074e47efdb62c4ab894c9e0784475062be874922d00d9b28c638961fb448ac40880c6f3da4d39d63b318de778dc326a3df9ed25dee160ce2337bfb960838e29aaf773e9052a63be1b2e15e41746f2424e7e6e5d2505063139f3900260ef1625428f7c1597e34567aba604c7dd7544da6167c9e050b745ad3c9d93ba8c1d5ce062ba5bd216a336c4e1d1b15dea08d4d13e03d81a3473f5a78c29f55095ddff076a77c907e67aecdeb80e85143cf29a1f3d6a969e56fa3961830d0eb - -OutputLen = 200 -Secret = 6f2cfc5aed394eb9d5343511ee2df37d5363bbc4ce3c8549 -Salt = 393bdcfe6b96960f25871964d51fd1d92f990044981a70db499f9815460be00489dba582d159e0aad58e2ca00d58e61aa64f0e -Output = d191986fa59af55d3a592f7a33d367c4dc685ffbe901aade3d7a14f750b31adb120375bf38ec0950582eb752ff6f997a59ccc5b3a035293df337e37112cbdad48efe86a44e83c6946f75c40d57636f1518ec0e74a284def4548e6f28d31c27677df2cf00ea666be52aafaae4bffcef28ac8298d5393ea3c7fe35e7007244f631f7d0d63cfe43b67b6fc401d95165f56c56d906d80fb0e090e5e454c56363c650931173cfe4f52bb55c0ff6dd04f5cae32b9ee6106c0d845adb00fc66c739d3f9462780fd4c0560da - -OutputLen = 200 -Secret = 8c5e9e4f07b7564e05cdf99ea0de3040e323c5c105d3991b -Salt = b1da4dd07c7b30d9bfbffddd6f388b6d1f625ac5943bed08c216a2493b239d148874356da988045b16f5246f9cc76ef556574d -Output = ec58e5a98d30d39886fd54be347179dfa81201994c1e22802e3fff6eb6f3ea0f459449ea8e273fd71f342f4e72b689da7f8bb0a2ed29d6226b61b151341ff3f7bbb28a7ad1febf1634ca6eea37867d0afaaccc724bff94fe84542f85fa9b258b50f5c75eeb3da17edb3fe73b378c00bf012467747cb8e1ded6f473df9b0f07b65010bab90fc38f14041678053ae2c67af58d86a428683b6605c27bad11bed0b46b418480dc07aaba413427e518bcc10016fe568ff249786757ae6a9f726832d546bffe7311262eeb - -OutputLen = 200 -Secret = a8147839992c07e3a5790abe0cdff3cce33df122b9297d7b -Salt = 19d6f941d4196d8f54c622ee95e7fbea3b148c4c8d88d5aaf88b901dcfabf70f7deb173e298971d0e105d9fdbedbaa034c5c53 -Output = 85bf0b8ec1cd724b0ed99b97b52f680767122f1d084fde54c7d8c4917e4b8730085dc480dd3426c1cbcd0637f2e535f382d18c5cfef6524f3df054401f6ff8d646485ba339cdef26169a00dbbfef56db9e4260db47168e1db8969b7466c394748b215810e4c1d1001e4a8d431ccd8aea3e46fb90b403eee0e971704fa3631c307b911bcb11dc9e8e17a821cc934a030c6c93e789cc55f0c1175b8a5eea83cc97194e55beb8fd41306f2d818e5f5a0ec6b33f68b89304c77ce1f78e8b66bb64ba2200f1081d95aa2b - -OutputLen = 200 -Secret = eb8476e33ac0102d66bb4b9c232a3fefad0ef585ea276703 -Salt = e23a020c92713b4f73254df3a2574b99a4c6beb162b3cdaea84606eb70dc86d5f68694f38eed7263f377c80f9dd3b4d0d08691 -Output = 0503857dfd445084a7a895fb3d3c6a5eda153ba5866eb8edd4d97718d012da420432eb289724fde6e5ef2e082803c21e2cd639610e1e8cd3e70ead3eb5527821894afc7a6b85c3fe8b95681cf5076df6dd93277f814ffc1719afab513822c8ea1d844b65ad1224fb66b24fe6db0c7587d39977185dfe4320e13d181e0dadef1a5d1810a43cfd1af03d61032a26af2bcdedfdcd2554aa7db717ac7f5b0d2588a15cc18fb450a3560b14fed92895d0dfbac582844bfd762884753f3be07ce2878e46ae977306e8c66c - -OutputLen = 200 -Secret = a3383c4c3d85cab884cb92a58bfba072f47a9a038f52c7f2 -Salt = a19936a3dfc74ee663f77e0f0d38a421dea11a00cf521a69c67272fba05a67e892c1948aa9883d9134446ad2fdd456cf8d9e99 -Output = 0a23c04167260c7b0f6699f693a26c7a84bf6cb6a5223b44e5a5614d38c90fa380d861fadf24dd338b828b34cce404ad3d527e25f0b9b0c91125aa2016a6662b9c58c15ba1294191b4ccf27abc2b23322732271a802f0eb0bb824b912f1ed30dc20c264793dc8f2be17544e6b2b13cc563fad0dd377e69f0d451917f66e5fdfa1e16a918f68145682a94ec17acd733ea8cde1e4d4263ff14908b4f1859efca4f9d66cc4686f716845cde6d8557a7c6b3c60a3d022b2a03a90e27238a37cf316792f0c591c244694a - -OutputLen = 200 -Secret = 307246121266946153c1ab65c0595a695863025dee7e7653 -Salt = edad94afb083c7f60831d808f75b8757aaaade00c5047b3b8aebca55c9bf0efa478b6525191d96d8e38ad96d278511de3c2e33 -Output = 12327d27a95e249845617fbbd7e2e19695749c6afd09239da25c13a14f3fa2198096f8346109412538bfedb9f05530dfede7228b4ba5ff4996875493a89ae2bd218909aa3ecf3a67dd7580670f36ce2267b868c181ce28bea4f870d78297cdab005282cc43d5c80edf94ea3ae799d66044d3e23b500e6b3fc4bce3f34aacdfa32b1591afee32836d004d453a3305bc08fdc2aa21966fd344177b581e4a11a53acb55714f9e457d7490dc2a8bbb084f6dc593498a548491998f88ceb762a8e11a102078146f9686b1 - -OutputLen = 200 -Secret = 3eec7661ccb4a60ed4f321f0f7ef8dc720612ac7919adcf2 -Salt = 1fbb896378649cb86aa2a6e6e3e92efe5e3c06ea9c0403ea392d7363ff51aa88bb482fc169e5de1af04fba2cd93da6dcb4cdd8 -Output = 110274f80fb2b93ae5078b589d6d2ada37b1ac55192b1f3b9a92ec17e1c83ddb0d2842a8de580302852f9d0c3860a36b43edeae14dfe0c878e0f9280dd19f90deb27d6d3dde830dbe094580f8da5692fe31561c23a27fa469c1003b4e53af036d8183c6c716a2aae7a897815f44149030e9b0d2f62ee20a6a3759b2082705df50cc8b32bb4be721df8a9165ed94afd40e962b90edbc64219acff81264a538906891667001b1fe787bbd445b466f67c0a333f2637d718a92fa0fa4597aed34e299ee9aba7402b325c - -OutputLen = 200 -Secret = 9e0006fdc0cfec9eacaf0014e6052446f70dc0d39fd16be1 -Salt = 33e8e51a73aaad6ab1640342cb41b37dd3a1fc5e05c40655cb5310520d7af3025ee208e06d0357fb796271d78ad4fd6c5dac82 -Output = 7d4549d68284916d57f0b8da6efe458a79eec0ee76f2200066479959a0fee93187a0ceca237322d20f36d806146b33b835822a714ded8828b12f7b3aad1b8abb5f65bbe84e0228ddc43ab349fd8c310ebb2d1f4dc5550d0546d981b1b39bcc3e72d521a250b9cd88d2dd8653219736705d7d370c5562c5997b555edc62a481c9ae2edadb4283b00af87a034bcadbfb349e97c956c73d8b98b28acc08219cf1b388d82ed5c308879a2f9697f1c8dfc0b3aa672a40aaa8e981a61654d2504d56824acce1d541cfb499 - -OutputLen = 200 -Secret = 966758f43b4a54e6755e0b100664d9b2a00be37136201825 -Salt = 5f9d9c724e66ff442bbc5beebff42795adb23e02db339d8784aff85792c39e133c3c0a080790be8b37a159443f7a59dd4b7ed8 -Output = e20a9962d8b9c87588a25b8d99fd4d8ee3b3aa517b06ce836d15970d6ad6dedd93b790950c6bf76cdab919a230325f10364e6a62f02f4c9a67bc49f02a087461af384bb522e53f45a2ab4509f873c8004c065fbf77fd6b5d951fa62f2f9f91a29f9ca4a8f9fb9f0142bdd55ff14c63349382a2d17d66954aa6b58ecc8a23a7f92f043d4aacb719d6442db5854918ae3cd8fab8d868cbeacf02d0eb6f5e50892e498f02fe104009e23f36283c9ce795254196c56ca1d15329fc094382c5ccbd93751439262b4267bc +OutputLen = 2 +Salt = ADC87EA121B83BC57DDD +Secret = 796203C647B01FA2D0D0E4A93E84C1295986C3C2795DF06A +Label = 08AE542228219DDBF9A8D50E +Output = 7616 + +OutputLen = 2 +Salt = F665E7E96FDE00414713 +Secret = 637FE03778EBCBA6C6DBCC718C2CCBB5947C69A60DEDA90F +Label = C74B195B1F2AE82D6762F6DC +Output = 9DD0 + +OutputLen = 2 +Salt = 2E4A482EE14CF6DE4924 +Secret = FAF194EE0D64C6F89E5BE3295549BE7BF57CE0E59DB49633 +Label = 41093D36F493A49BAD47D6A4 +Output = 455E + +OutputLen = 4 +Salt = AAF6A371E5790C744B98AF130F3050CC5C605B3C +Secret = B841A922DFA147076AA1ED7DD3705EDBA4199D6DF6E330E6 +Label = 1289BE5EC83E78BEFF0FC2D5 +Output = 932EC004 + +OutputLen = 4 +Salt = 48F90F8314E0E47246E9FF29E6F557A5961EC737 +Secret = AFF625EFAD889AEE63F3A1B09C8B60144816B5EFB43A8EC8 +Label = 010F0DB0047EB8F34E139651 +Output = 125B9EF0 + +OutputLen = 4 +Salt = 5F7E0DB0FAF41356D7B9E657CA2C8F138CE20858 +Secret = 5153F70B8DDF868F0BDA2D4E2E0453178153E8191CBDEA66 +Label = B90C4338DD063770FBABBA3F +Output = F22C8BFC + +OutputLen = 6 +Salt = 5F95C21C0FAAA5ED54916EF43032E7CE4F6966E21EA5771E9FF9B36282C4 +Secret = 59E85291DB7C3CE97E06EB0D358DD176D4462A1742879AB4 +Label = ABBBAFC68AF1D09D04B21CB2 +Output = 5A7E385945A1 + +OutputLen = 6 +Salt = 436C6EF179E53DB994658486993588F8C499D4504FB1A51E1A38161EF810 +Secret = F59971666D8928E44C1C4FA2882C7A7E4CBF085C4F0E9334 +Label = BB5A980756FFCA949914DE33 +Output = 2A2C806D60EC + +OutputLen = 6 +Salt = 1618FBFC38B0BE99CB65A3DDC56AF41414C34323E0E063CD24F73C28152A +Secret = B040AC9058C67DFC54AEB3CFA0910FF278F4E5E789F4F6CC +Label = 280B4BF782AA9914C84F5406 +Output = 23B2C2155011 + +OutputLen = 8 +Salt = C0C6CD1687C6809A5DECE6D611405AD9524629A079BD648E3CCE76EF280D883EC74DE82783BE2824 +Secret = 31BD281AB64DE9BA42A25E6B3294026CD7914F96E7D85D74 +Label = EAFBB57C7F9B76C5A7698194 +Output = 39C67239DA446C7E + +OutputLen = 8 +Salt = C90EA030D2FA3946B6BB574566A8B14ED910833F7B1FE7DBA555FB9DDC53F28638853FFB387B1938 +Secret = AF792132F5735D0F1D4E7C039D9C03E48A2EDC68CC9C235B +Label = 9E75239D8914092B3CFF96DD +Output = 65B02C76961459DE + +OutputLen = 8 +Salt = 914727FFEB9CD8DAB85FFE26090D62F078523C18D8E6F139C88F911B6FF5DB81F4CE0683B50A03FF +Secret = 44C2E7E2483BF5B7C423C265EF09FDC7E435C3854AFA924C +Label = E55C098DB7280B879A40871D +Output = 2ED703C519DF9467 + +OutputLen = 10 +Salt = D3823F6DF63BC612680ABB44C6391FD477BF53F9909CF0F4D0D98047FF29AEDA2E835699C85EE4B3F92C76458C2E8586A749 +Secret = 353879522FB3DE4FE8D91A833B58D78FA80D42F670E2122B +Label = 2E05E1B4F1A30D183F033E1F +Output = F73F5EEE414EF9C7A1AA + +OutputLen = 10 +Salt = 2C31C73AE56B786835AE66FD6A7458640F510A7EA8F61F8240BE70811B6CCD6A91DCB9B46CB20E27B87233D9323A63ABC41A +Secret = F6D0D60C14838FE78F4EA5E05DE3127B54EA066A20AE55AF +Label = 2540F6996342ECAE4FB1BC2C +Output = 6CD728F62591F1745867 + +OutputLen = 10 +Salt = D36662CFA05A62D59D30DD59EB1528EE0B863AD20FF5D9AAC185F59C55EB2846DD12AB25C066E62A628495738502FB702528 +Secret = B04249CBBD9BA5BA9BD7255E5575FF68255EDB3DD9AF88BA +Label = B14BD1AF7D002CEDCA6515A1 +Output = 045D67BEE731BD53EA52 + +OutputLen = 12 +Salt = 476AE3CAE1AD6C92D45A62F650DC40500FCA9F046E2DC6299213C40C14AC1D39474F58E6EC1B5B6E6789D7C07F96C6906B631113059C0876BE035F55 +Secret = 7B290A6246048C531AEBA198A61E01FB525B5A3376719AF9 +Label = 67AD7F98C2EC4EFE455DD13B +Output = ADA0B609D1D0C355B4A48B38 + +OutputLen = 12 +Salt = FD32AE3E64041FE77C4CBB68093276077E50E188405138C1EF727C1CC82EE943439EF1D0049194CCABC945BD1FED1D77E838033768600C438A50A723 +Secret = 3BF11E748026BA1EDEFC2983CA7E6D6F7AC251A041248B07 +Label = A84779F16654191A7E93DA85 +Output = FF1D69768460516203E33D01 + +OutputLen = 12 +Salt = 14DCD06EEE9E2F26B1AB9C724B5EB0D926945DDFEB73F884EE56D9357A212191D548928ED2DBBBA06FE6AEAC3CE9E14CE2D2AD16EB62601018096CFA +Secret = E9FBB8FD92F39B7476708CCCDC3AFC11A8EA91416539E594 +Label = A0000E50E7A1294278ACED50 +Output = A5A458F45C97ABC74CEFEDAD + +OutputLen = 14 +Salt = C28F152B77F4AF821F60723187501C493ECEE4F4354BC2B555BC3B68915F57614A1C79CE31DE2E5C4DB1242437DEF7BA04288344C294714185A800DF84C257B939579AC29A9A +Secret = 6464DD12225F8AB6A847657C8F2DAD48343AD19CB1021251 +Label = ECEAED94CCC9D40559D8A2D5 +Output = 376646CE4DCDC86C86923999DB9C + +OutputLen = 14 +Salt = 7D444D26C21CE88D3A026485F82E8CC2D68E83F35692036C40D6D98B3E10D928C969E7DEAFD6B8BCA79C50CE8DDBB257E07038ACFC5E431BEF429C673CAB15617B25C60E89F3 +Secret = 5F51E0BC30B346701336EF53087331D446D0BE5A96FE6228 +Label = B21AFA500B5801ED8EF21367 +Output = FDF1642950357842F9431B6D899D + +OutputLen = 14 +Salt = 3D01808153F3F6390BE601B98B0A93FDAAB471A864EABF8F02A9A5668BDBCB4CCBD14929D87ECD5588B3297E20A49ECA3E66136ACAFDE3C46E121BAAE289D955D1D45CD7D238 +Secret = 3C3CAF127510A848FB94A756234F274063F74E04286822A7 +Label = 5BE4A565E213E8D46571F7BB +Output = EF65E5A8975A0151045D1FE7570A + +OutputLen = 16 +Salt = 8DF2B458A9DCF18097810CC12F641632EC94DB6DB4CB4881144940342B1763766DEA9E3CEE23DB1BE90DC02F57EF3FA8E3096AEC43AE1C2551FB8F84FFC7D5631D6CBF891377EBDEF6281CDC77FA5059 +Secret = EB2EFD0D4EF97D38057FC44293090377C934118C062BCCF9 +Label = 5BFB10ACE877F0AE2B7885BA +Output = 0AACF74FA484D67D9B3B36B0DDBAF6D4 + +OutputLen = 16 +Salt = E6C328E0E5AFD2652F452391C2435F28CC85D87A45D1612276E00C2F0A2D4F52E95897952F5614CB9C0D26B8E1BA2673A5B11A434158A368702D49CABED161AC74640DD5267B05E1DAAA99E4FBD61167 +Secret = 8DB6D396E11F515657004CBD4595594FAE34CEBD1B119647 +Label = 2F1F097C29220466F09DD21B +Output = 7C90BC47064293BC4B4D0F2EB77F9A8B + +OutputLen = 16 +Salt = 1B9681DB4DFABB3727E747F89894B5344EB2C1514D05AE9190DE0A76469EBAB926A8BD0AC81AB4CD23974011A823444E1E88F2C4309AA6DCE4AD17F09AF9390855D7D00C99D3EB06409D36633A94157C +Secret = 73B1921D043688101892793A945E0F96AD8E825B8C0FD531 +Label = 8FF81FE9146BB5A9FBC73272 +Output = 11CAB5D3E44106B3A56D07BC339ECCEB + +OutputLen = 18 +Salt = 2B575EBFFBFCB1E1F1C76E22B16A406AC734FBD0DE3802AE4BCB21D343BB12FC8DDBA9B9EC8C2299B11FBD557936259A8E008609540CCF54D9624DD91F2908E5E5EEA9AA59EE14E66D96EF925D23DAD3CC77E83DDA94A6914C70 +Secret = D12A9C03AA0E8D25FA17BDA4D452569E578E0EE0C909171D +Label = F76A5FC527130C511F815B3A +Output = 8F5970EA7A13669285B0B543ED2C0ADA516D + +OutputLen = 18 +Salt = B6BB6C4856E462082F03A4E1219DC6DC9BDF195EBCB765CF060C41A15BEFD119DF3015241E3B7CE3FA5AF873C181960F36152417F75B86020A66876C77822F898009D0C541B16E1E4B8C80C9721BB0C27EA4D863A69C96359B18 +Secret = C14727DF8CAC2A2EA53D61750AFD3E841159A6E737B6B545 +Label = C45A1C8B36311BA9731AF6CD +Output = 11F018023A2FD987D2BF346AA3375F96CF30 + +OutputLen = 18 +Salt = EFC6C417E250117EC36920E85DBD9C9A2FE5954A8DA13F9BB97E7A700380CD16C5F5F2244972129C81921306993147485EA5C2F9C31B49C0E48F2A89EC079499BFCF1729468268520247412DB1A52789C3062CAB2989FDFBE321 +Secret = 71955B4ECCA0A55D105E4FE9A405ECE0A1ADA0A373A09D68 +Label = CB73F5363AA7AD18C4615BB4 +Output = 37EAA2DCD6FF41C35013813FD67F65CFFAC5 + +OutputLen = 20 +Salt = EE913C0C8F8A7D6F89474019F92E784698B0FCC55A146AF6288440E5FA6DEF96D94BBD7934BB47410CB829302C93525018E8CDCB45ABB13A0BE1A6053F1F85D0F33CE3DDE75E215A413FF332390890F2BBEC3448F617ECAC996BBDA5945AB71D1027A400 +Secret = 2FD8A515D0A4708F261BB981E0446F47F044B8FF048C1B62 +Label = F1EB6BEED62AA9BFDADD30B6 +Output = FB0C680F2E1361DC3BBD68367D35E3244EB2618B + +OutputLen = 20 +Salt = 69B2B24BBE0D0D37D476FF5B6304DFC46C047F87795B76B2A72FF883670474585CC49021DA3F12D0A3B57818750DFAB86296CFD2CA8E3564C829C65F54E628BE48EF0D72DF211C2DDE236D35FE2C7136532515235ED6B8F64257BB591A402D38B79A9059 +Secret = A67B30A4E8F5AB8EA67B2267BB70EE5154331E941AB77D42 +Label = 64DF27367495900EF9CCF580 +Output = 74F5B5B77CEC24A65F606EB9F1992AB0C6715F46 + +OutputLen = 20 +Salt = 27207B1CAAB5130E6D02AC75A0187ACC62896DF8B24CA48D9364574F17758E04B66A008B15C5BA621264D33DB435069B3EE3550B9A76A284C7A6C51FC420207CC07BAA2EEA0DED75CDA66A548B9E1D9340065CB5C9826F5A11F313B013378E6975F4B301 +Secret = 552A8673462D99B105756C60453B8603223A7ED4C8F10E92 +Label = 4389FE8E48BFA8F2B9D65F11 +Output = BA40C0537EDABFE5C0C9C6209BAF1CFDBDCA5267 -[SP800-108-Pipeline(CMAC(AES-256))] -OutputLen = 64 -Secret = 2451975a33ab0c7535e00abe7b57982335b0471ad857a093c6765e6c58443852 -Salt = fb95eb3c47dcad3b783b045b29bcb6f5aefc0389735843b92b4d8fab97d61350b76b2a83442d7c5aa497aa1cf441760281a08b -Output = 2f157687f782c8b64325826e3c755194c70abffd9d78c4678924b9d73dcced86dcaf7dfa3bf56cf03fa45c7fca05ca1092c41bbd934131e95db2b204241a9d02 - -OutputLen = 64 -Secret = 7fcd181cf6af29b4413597ca3cab649a2d3fd4f29659ef0640c296ee994bca86 -Salt = 57a66de1ebae7ba130b224a0f6a2fd6b043f08e7a0d2cb655c6f1aa7ec435dc33aaf8758f1c8a7db692b341e4c82ee098f6b7f -Output = 130a88acbecc0e43da44f2dff935bf2ea51f8a7d670c4dfc719f0d130797d0d86404e759e44e206fa7b6d8c827c32fdde3a0ce7e4935b62f001840c7fec6df2f - -OutputLen = 64 -Secret = d9bbde2c7c3778cfb6ff606776afc4bad58c23c2dff9cf2a3eae78a60a29275e -Salt = bbc4394ef68f23f7a67c27f4328220e73e7688d7c3711fde86d1c098472c8664f9227beb1d39c4cf862eed000f8f99dc1f604e -Output = ebe7c6b6805f4ccb4d4727a567f18d899784e3b0089af609fc05c14c8e10b88a2639978da8dbff9c9a3d2e3ead97813c2fab51e8fa7c410deed9b4029cd33996 - -OutputLen = 64 -Secret = 33e8f21c478d6b957f1cda6f1f5bbd216ab88c932709f9fe2f4980fe8e277a23 -Salt = 4fc5f9659137424bd630257177efd35b58252196ef7893cdbecb95610ed20d13c3849a4326ff6aba7d1af0615cdf062674ce66 -Output = 49a06bf9a6ab3e166f08dd5dc4da852bd82ff10050418e013b58b61a0d382d47d4abfd35d37ba0b417b6d4957e6fc37a1c048ef6e2c055ba57332d2ed383e57d - -OutputLen = 64 -Secret = dce52c7786f1c6a728d14fbbaa5e920c9a5051d21c1b623754a793f1f84663d9 -Salt = f6016f9c03f7e609196210ed478495d6d55ca582b7bfb62e41e9331bd43d90a14a4ff274e43a487590b8def5e6ff23fb2fb900 -Output = 3a8c7fe250d62ec1d6c70bd79e1b12068c6499b4b36411e0887bdb76e94c9ee8e2f4f76c46f1b6c377d67df6a9e5bae425010398eec8c04fcf00ed2bfa84d68e - -OutputLen = 64 -Secret = b2ce98b266e85fb640274e3aa247637ba5c173205dabcaa09ee1a8e6b6f27463 -Salt = c641ef0ff5554b47d0ba5e0950868d314f8d9baaa67480fc8b524f2066abdaa554aed433cac380ff832b58822b82c397fe9652 -Output = f5fe0478c26aea5ebcd1fc6acaa11f93d34c1d68f332a04ce7630c7bad252faa01b429050e32a8c9023c0f18e2a6a662f7fb4ecc30d9502db032e1270a660903 - -OutputLen = 64 -Secret = c4d7b1947fb5a4e7fbe170b8ac174a021c55e9870ab673e0caa4b9dc2f6c3bcd -Salt = 434c7c85db16e28eed155b3b00661b3872551bf1ce5a8ddfac790fc55d287ffdfe4b950f7367559d54a67b0292ea7591ef4a5c -Output = 41ddb99e4f887c80f665d5906e3eb41edb9dca656639091a03a1f81483c7c5b9a5684342698faea97a55d438894d3f19304d84ca45bd49a5403a4ccabae2ced4 - -OutputLen = 64 -Secret = 20fa53ec6dede8936cb903146c75d8f4eb2545d8e5abf54ba6e775519550782a -Salt = 7624e18aade428f09095277cc6898b9b67b9addb3fe48cb37f9cc2f6c2d588fdca789ccc1aed66e35821ac5c4e855fbeca97e6 -Output = c5a6b8f31dc484a38fbe31a5792e7dfeffe33ca4efe983361f41ba6827ad3f522672d91cf2e74382f20e12bfd58c17e9314630fe374d982eac766cf4fc08aad5 - -OutputLen = 64 -Secret = e8d63d9905606d82d9177580fbc241f42907e036666ef59feace2dec45df9c66 -Salt = 6b69ff77869dd8fb85cf6d0ffe6e105c3728af45009e7036898989ef1b22bbf9fd66f4500e084f431bf9356a0c892c5f5cf993 -Output = 67a9b5023d486230c08ddeee3cd6acd23e513f1b154842da370fd732a85b9d57c3694d8e682abb8e7392ffc5e24a9f92228641831c115876edc0c7b2187c42e0 - -OutputLen = 64 -Secret = c1618eb4c861abb11984590d63dc0b01b15529b911bf3400f58eb296be908df3 -Salt = 85d989843756bbc65212d7f16788da9b33687499f7cf1ed554b6f9cf0ef868c7cc211052407e49ab8730082f85df53a0b4ec8f -Output = 5391909eb1c77c2f0febc9aaf76ff8e31f7c50119ef65d6a187e649378e56e0b950de3deacab56612dbf30ddd370599fb9449d21057607aa04c52c1c119817c0 - -OutputLen = 256 -Secret = ba1f5026bc68fcd2bb1a87df8915bf99f179be38a560650df362e6f2bdf2eadf -Salt = 123f7bfa257435b2ae534d4e4d5e74845d5dda101f388117291f8d32035fa2693068078574d877d9a7f0f58b347f34c918fd32 -Output = 1bc8dc9410563cf152db1e780fe196566cd4b38e3134d1cbdf91d1493d2ec150b69cd64904137621b8e61afc31eb9c897338615e1c8e03d59203f4e29329cf83517c37aa9cf5e17fba9d4150c6888f889f27a9b00c1570f403cac11b8022cd076f55fcf0c606a8fd77b1edfda76289ea180c03dabc54dcc704c9938f536a51cae2f18b2447514d420fa5877ffa230e65e5c4d7735ed2856ed8e27fb271314ffdbedf5fae4259ed49e0a60577e12c80e00f2152c47dfb99a19785e66a064e0f98f8e5753b36ed36862635f5f415993877115872630642128b3944171ef5543599dd9767921dd3f0576a6dea1adcf8f9292e5b9ed907fe4495dcd5c73fca33139e - -OutputLen = 256 -Secret = e5822a75634aff862edafe74d0ee826c5b699f1bdb0d86ceddb57c793a54fc63 -Salt = 278942b9bec151e08a550785dec0abbb5b99d60085cdec41f6a2b0db1dfa14cf78d1ace3c4f69df2504674c81a4370d730dec3 -Output = 8938c478f56d8fad340255d91d7f3a565cd5058d87e1273c4f51dd7ce50ad74905af88c822ec61d1413f2dfafd0d93a6645f503296b2703f4f19e7acedfa4427c1cb2be44904821e35ed5bdd058124cd5bd8f368f52527d0ecec5ab32fa3fa6c717b8b8b427fd8a6ff0989ddddd4c6c699d4e20c09edccf50be09fa285cddf5e26a4ab43d90012f10706086c2936a54d0bb0df4bf72f319a8c869d4fbcdacb9accd98a2c737ea9ac77c8e65883b5a702c04dc1f519793843749c6a174ec80db29cb39b071c1add6c1661f5f74a5806edffacd1332f6e03c2c144f0f8b29d8d1ab49b045f15eb04774c8722ba7da42bcb64ec824179b31341f2d38a614e90fcf5 - -OutputLen = 256 -Secret = f225059a6e7d6c1201549a5c975e3dfced5f46bd5d65865b8f14905222aea740 -Salt = 2db97126acf5597776a9ea5dfe5334937399a9acb2754542da3d22ece5d3f501bd49707b64f8c4d32598f8b5ff252b4f7ff163 -Output = d1e489470ea8efa4fa1be8a33ab156fb623d91717984989608eb289c8d6a24e1d0c2890b0e3d2fb0e513d49f19cf43e0a209112218630106138efe59d250a5c83df86897a0d69e244eacb90b1a07086a5eef1202867403f5a0e1da540d8499718b12c49deb76f68f623fb7731f739c478e871c911772781ce04d8a3d2f5b9988f9d99da6f387fdc4317837818f570a18178677d65e799f5fd3bfa08a52cb24ad579033eb3fe70eb20efca9f502efad3d5ec823f764699075208ac59457c9e98cca48eb15f545e104784be72f59fa69c635845dc379fd451daa7c3b0548d4ac52594bbabfbbdefc0fa6c0de1c526ecc16f2a078bec39a838d077eba05b0080a09 - -OutputLen = 256 -Secret = 3bd0eefd7090b2acb3359bbf844cb81ea9cc1844dbc458dfabe48fe6dc95314f -Salt = c4c4676060bfe1d4715308fa8e486ce322fc347ebf48ec8cb8c4c03c94c701c12ed18026637ed9369bb11e1c79033dfcd3201d -Output = b9b714e0134d748127b98df7b628a9cfc2963075ead8e9a3b7371fde3c3d7b81812f19b0a18a3c34ca6e00b034e8c6ef6f76589de23ad8242c094b42b642357f50252c51b8b745152a5e14f849e665836e750f04a26f9af7bb384862304723c631793dc540b6ec87b42364c91add748f2e2019044bb91d392ede8787635c508f9f59dd54c4041a3c29d0611880a9034039765286cd97a20faceb5f664d7290f0578d020dc3da18a7b86e008f17cd27f4a41206d5e39993ab8a71a5b5f33ff464ab59413ad4d7b6f96146699acdbaaa43029f60b3f372e695bf9af892b02eca26ca7a7aeef070f0299a4b0348ca9b7a2e238253c0a5ce22107a44ba1b951cad01 - -OutputLen = 256 -Secret = f8d2a603b7c2a32a9aaf07bac3f7b04e3b592ec726ac969d50d106f064d86d3a -Salt = 0b774c99580c1730bec9916d13de77e5dc03f4cd974028062331dcb0dddffb41aecb4f6a81db1738edf3f5bbd3a43bdc73d512 -Output = f49748dd62bbdd029246db3f742ff4106f8bfb46b230b39b4033a25b7cb02e1cd9e8f28cda3b1a54927f0aca66d2b48e78c4efdf73e9bc16b3fb0e00c58cf848597c3e0f21eb76ef81dccb8ecce31a119fc4450b1ba2570eac2b5132b2288702ad66d3b32c0dde73a86d0b8a0497930c839ddb1345f87b03bcc8ae4218ae76e3545ae8519a1c2b76b51c101ec36918ee2505708ffb4c823d1247661989cbce94308d3742d61256b13f6fc6bd1bdaae930256cbe153fe9a3d3aacd0d8281dd8c11f08303617d9f638b998a07a7a2843ca10b8915e05a92a147eb216f55d6c5fe40a0ef087a72105c797bc15342b1e29240184a483fe8672a89b5fc2ed821f837b - -OutputLen = 256 -Secret = 41271010ad5ea8a2f6dfc2bf198e5f1667374a348062ca15e6952cb58379b01e -Salt = ac10fde75d68e7e422473b32305915eebca6937ffdc84b3bf568a599a56f4ff3833d0179e9dfe4d1e367f95aef81a3a66da519 -Output = 8e77ed8a14fe23b5cb606fdd9cc30f5e4c9953fa1e9b3a823dafe5bf8464203733cb060f0c73688fa77aa1a8aa978defd298d23b1427e895ba2108049c4d90a784600e7f696b23cd74af0420099bb8447549d3aef099eaf1e74c3d934bb8948873f53c53e7dfd7f4e12e838ece034e9430cb2da2b26e3b8f65fdd78e2948b0515cd4ff0b32e77675f8fe50a15badad0cbb10a8b8942e2c10c07bd1f65f82dd7a061ec56ee948b832ae151bce7c5c32aafe2e8e2a74e4e66b33226df74e895a28b13155d9645c33921d26b0c9d5dc95030afa8bb22b6fda234d012c6afc52054eb2bdb8bdc1139fb9601c5f5dff8560c2397705aede6b455dd195be9af608787f - -OutputLen = 256 -Secret = a64d81569bebbddac55a668baa4759745c9c29c6b1c74c6699401b4440f31ca8 -Salt = 9a66c1c6d67087c98bb17ab4c1312db42e00deb15e5327e8fda925e42d74dec6b689f91868b63160952fcccaa01bc193e7cbc9 -Output = f789c57005bab4ff3e2a2e0c3aefdf6af90540ece995c7d2b455734defdb5101d8dd0df167382159afe4359ed7c4cb1b34f4aa9e613085f744ce885844137a1cf7847e10d529d7b59893cb351848f2bf102ca67fa97340273cb9ffeb72856f13a3e82c7e2fdf9b78d15262cddeea95f8d32bf458cb9d5ce720626aaaae6a5f079e7e820ef7060107319d4a909ef15ea47ff0056fa033d79b81d38287d3f76cfdd3eeebddffe52c575a707d3191a52a495ae9803ee0408e033b9b0a185cd0ed499d65b9b931cfbf2bb5aedcfff295e8ffe2a00e279dbe0a6a1f3d94dcb6fa5a6308d5e8f8fc5360a850ddff93999a440f98a6464b1bac845ae5c2b1fc576953f7 - -OutputLen = 256 -Secret = 3eb7013682c545812768006dc13529de7313a36f92f051275e2790a18568a3c1 -Salt = 9e2fe2417939413b13ad1b005b6f071172b5d5d75c296588eeef40007aa71d1d5feb918ce520462b4e5e3b510da8c16fd08e87 -Output = b05fd60ab2596cf2916e80d8a39e6366b6d591cd4c39fafde88db87df887955dba6d49f1866c3ed5ffa18f24c7571e5d249ddb6bda3d66f6f3fd3b77948bc9b8d29dfca396fec85f74eee23b2e451a880ff5a481b623f34d0a437d18d7409ef15c177848bf7bb7485dcf027c81c47a3cc039d99971053c55f6331fffcad6be221b661d4246d67f6a5981b30aab75e95f63da186ce4b9f122776c7d20a37c48f131c44940cd1c9ce2f8727e6885eb8db73533f85c1947cc280bed185407e03ad2c6e2c9e430360fc80fedae3905684d96418f5920170dcb4a42c3bdf1d922f8ec38e672521686d2323fa9b95605a3ce119136ba9e5321679b8c903c7c5a12730f - -OutputLen = 256 -Secret = 2f7864e9e5ab4f976d0795be2d3a5fa8c3c2b466ad8b59c9f536b17686eed9d4 -Salt = 02246dce2b2e53138cebdacd13f40a4ca4b8f29ce6d48fd76d4d78a423770676e79cbac8a65a86b65274f9a5c14c5faf653396 -Output = 1206941edb8a6638687b7cb75b7afce7907ba43af4e74933d98be543ce44ea961bbd9b8a11b48b4c1ba3cc5432a5a9e6bb8ab2c33f201893ada66ad4b4c0a7dac9e2a8be89c8febefadc514a12bf7dc9bb737e0281667edfb23fa285a80d1852d834d8b4f13bae2c9dcb81341d9e46191157307c2ab54b2b943985a9ea3c587c1cca3d496e5399b9eeb84ea338746da364c97a2f3a28155d2307893835556dddb6b8ef419a6c0d1fbd2638cafd657d7d18836fcf4c302b54ff00b6c0f18e9968e4e28c510e22b0ad1afa8275d5c91fe321cdd0dfd6b5ccaef5f6259e02f1617fe1344c4e02114317e9d93decc24506c8070395b8326d02d1af6397e52e22b8fb - -OutputLen = 256 -Secret = 5ad5a66d7ad1d61c9847220f9b89f6e6e8f34ee7955e2430f9c59f106ee74e60 -Salt = 52f0c094b6ac4da8fe160daa4a825a56e86280d1b32da9eddecaf5fd2b30043b36184cc330f64cce99d27b810bc2459d740a7b -Output = 32176848d7e3df853b205d7332de4e68f3ec17c3e96cc34f3ab7a216b14fd0db3c5c9c4348a56104500d875e540e5f75e1c22b5b7ae52ce875c2aba91db089c49f8168838663a9c6ae81cc149bc9f8e6dc1dca7c8b2fd98b452dcceac9fb7193b81999ca074687f0f815cce3ca90f90c4d27c922b47ef32005650956a3ad4c971984a9532dd865c0cc0a2227c908b93f1feb5c8e9421ae85693f584cd96c154260d222ccca4e8bbb018dce7c69c1537cfdfc6bc763425a4af01fddb5361cf4312a1608208fcd713b97c242133644cdabde7954aa57fa4fb27d5e84fb19f07165c9548461b8092f41e0a63661333e011cbe226ea387b49232b8717ce5d6dfbae7 - -OutputLen = 70 -Secret = 6333a5741c5af1804a2759dce4415504bf91fe1b7269a4ea71aff5bbae62ca18 -Salt = f6ed083a7477f8490e2455f0ff0cb2ffe12661230f36581554dd172c338787355f8f91e435bced36a6a11497ddb3a8c18b2520 -Output = 929e5cd9a312832b46526a403f615c394b7fc1b77967d12ac52def3fe8e79c4d9318530fd11cc89285694c36b9803e7b0a06843cbcb5f09979eee8ab383d171fcd074c49d176 - -OutputLen = 70 -Secret = f4dc1cee2fc5bf3503ec841fec4c7f9e389a09f5654d5d24dd3ffbf027263c79 -Salt = 00d5a3ad5adfcd1e0a1387a355e68b5158fe5e3fee3e9b2144d4b26bb195f58c6a8f7a2406a9f7454945fb4f366779db74fb43 -Output = e2ffae2d070a30691e2ce141671e62fe82aea61d4c54cb71016512638a278ab4e3fef6249e85ae023c927bfed9f95eafa24e02e9f9a9b1e6bf17b8370009efd9cfcdf5e582d9 - -OutputLen = 70 -Secret = 564d1579a45f3a1920d22991e4a1e954bf39f87526d2349582c41881bd08f5ac -Salt = 8b9d945a08a287fb71250c85cf6445cfd2f31733b9a12d4f8c0e9a5cf546cf9c193f5a401909eb895f75a08a4d751c3e906c27 -Output = d62e6c34a05cdd9d4f858350041fc7e3604308bafeb5e66764726a1d1bde83ee537e121fc69c54c754ef3625af808f16419a0dd03a5dbc29864d6984201678dc698d31cfc4e5 - -OutputLen = 70 -Secret = d0541a3a5c664dd67804444516d0f8edbfce67710a5da60d8ba7037d23ae3ca4 -Salt = 626e661ba439511f49214dfbfe9f5ed5861ca788469b59e2caea596816f2b0ba0587a1b16f30d0a949ac3a4c7602e4c1288150 -Output = a94bc2032ea84de314ac0a858dbeaa50c86d6381b04bbcf2e62695ca835a7c632d199687a83db1c9824e8fa5bdbbdfd8f244cb3116f76ba669c9e79c83edcb331adb188e05f6 - -OutputLen = 70 -Secret = f339a7521aa742cc08f9089cd4318d009c53b6ecf30f74799cae31afe3128533 -Salt = 0425076111474567615091f8288db0f07172a2d922811b1afa2b12376bd435d4b94c86e7814f8b60ea53c5cefd8e7b604e9093 -Output = 444c2dad12d5097004c93b8e5dceaf772e66d4cc3df61f5b15804779a215078c6acba1511c68595f1151dc082797016b110beadc044c2fce4142b4fa291602ef238415f12ef8 - -OutputLen = 70 -Secret = 450c01b6a252c4b4e65b4dd54d1b074f5da9e2dd5f45e74637db6f35f107b91f -Salt = 088c624c9b0ffe174118f485bee42e68eef0be6f89957128e03bdcd7360bfb55e6835f1bdc5e2f1c9095966ed7ef6475343440 -Output = 3ee7618fc7d6406e7520f05dc756ce01cab2b3765226bdd88c7b2bd2892cba9b7cf1384fe10ef2c9f69c38df82b72e2ee8bddee073c92e126dd44d749cfba035a4198f36fc09 - -OutputLen = 70 -Secret = d3e2317bd558652ea94b626aec5459d08e670985ff072783409257a9d103a0cd -Salt = b7d50fa486db4bd9e1ca924075c60abc5b9ae1bac1583e00fd4ca2f6dc984358740ff54244fbcbfddeba6006e38c858abf6620 -Output = 6484b2711a597bb3be7b768352d4d0231d57e84b66aa8d975a126f0c25a6381092624759753fffa9841dca7dd688b0cf330d5a7f9093ded4ee107198a1726687caa59575614b - -OutputLen = 70 -Secret = 5c5ba1086b46724e5a748c476d6d06124ed667ece93f17932e0dd30b026b5047 -Salt = 94de213468c8c01f24417c90a325fad7a67f95aa23b44de648c24f037dde2eb9f2b8521e7d638d4516ed8288bba610affc78a1 -Output = 4f58811d2bdd5814d3e1e306fe83fe8d9c96e10058e5321f75837507f87ebec07de55606305dd53cd25a26ac63ff760c740a687459ac950e95814e135093083f9786452801c0 - -OutputLen = 70 -Secret = 6366b8551554f0d248b3b0062009177051943c907a9af0d61e844be0f9224e6a -Salt = d0a2e5598711e97605cad862abdf7c88f9f0f4a6a2f55fbe1ae30805cc333c6285111043ff0f3915eb24e78eb6bcdfa7c7a27a -Output = 4aae7c39ea031fcdded72581228de23979cc0dfee63c9644521a3da817aedde456d3037ef17717b7256e425e7a4ed501fbedfe5d6cd652514482941e057f92cea792273ebcc0 - -OutputLen = 70 -Secret = fa0c5e5a77f8af61a2e135760aca6c9b95e1cb2853d1803b8bc6271861529d3b -Salt = 429e3f6491d10f587d2b2592b89c41ce5f53c66d7d426ffe3c7df35421c752002ae6010ae11283055bc0a50e3da9aee0b8c4b2 -Output = 22a90b749682b896456f01585edadb96a3902d7ae424dadf28c4bc046026c5cfd227b1ed26ecd963639fa2c825d422dd942d0b299165076a553295cfe549ee765f4b5b12985b - -OutputLen = 200 -Secret = b4e1ae292eaa0bbb308ce5d3159e86dba8023d86f85e2051c1817e085c728a47 -Salt = 61f7289a362b5b550fd99e07572f9287e7950d8dcc5843c7ab6d834c11229ad8e848b94b15ea6b34b94bbe0999262deadac4b8 -Output = d1e2895e90b37879b7d51c9ad22f4e4071d8223bb8ade875c8cba153dacdf077b43409d7b7a8a9e2a127b7fedc1f37f9647635a2ec5eecc0871c355891e09abc9538506e88f8a5511b552c940a28db02943a2322cc6f086b0e24a608c826b5d3e9399b7bacfee90d6e4b869e481f7993fc16a38aec08eebad5dabd6b767a8d5cf8a863129cce31e0796e76c55456a81277467e8fd51a2b5fcdd69afbc3ddbd1044ba08e33b18f47b2c66faf43195019ed175a64b54683d82b3c9e6182b62ba609f33cad7101ad923 - -OutputLen = 200 -Secret = e738851acd922389859848ca3e89b044318d47296193e0cdcfeae8c0a74efa5b -Salt = f7b5fbf9cbaa4a5e005f21c1a55d9e0766a3a3c9397e2f83ad2383dcee8e326a3d46bea171ddab5c7481528a727e1bca5c79e0 -Output = 1fabe8f6df64fe4f2e059c0a3540cb7426a309fdf2dd94791f4df6b7dae64ca4fda38260bc1a6cbc27582e4738d361629babc34d1f88baa4cdc506d7d2db0d4e45f65b8e29a1c49bd2c914acb728695ca4cbbfadb7b8e9e164088587adec35b67ce5cd1f9fc9b97bcb64fd69b4cb6d1ea3c5f3f756418d16bb7eb133c7630ceb2c5cf65cd3b4199c194ce436df48f9c23eb4098a067deb89b611dc7ba403392ec4cd926287ae0f916cbb09607eb428df1a95e1353874d46f187c98ca53978362288842839cd7ba41 - -OutputLen = 200 -Secret = ff7a0e14c1bb279968ef7fb657f0d80bd5bd21ac031e122c15fec17f3f963d69 -Salt = db0bbeb169dcc93f6b149bb5e7251fccc04d872b34a8193fe41f69c44923f685a1a98c96035f6924d405104c4be7d21b266ce9 -Output = 9ca9ce6eea2ad4fc37efd99a7f896c79c7b9762bd9787b4705eb94dcdb48caa1cb3c3c9fba324976d9659799d95d9696ccb47ec42d9706889629437d975211d7da4546500614a8c069377d0004055c97e90de32349b1590ef4e9fcbf8cf3f56f8a0a724996004d11b379b4297699876566c448e22172017f51abff49eaf601b85f29f794373e2ec09235defe9ed47c913659c436fe17126e7ee19f6eec9fe47b25b54c1c2ab8227cc28e9b4df33d404aedf4c66ae0877e981a99708817e7fe60db9f212118ab530d - -OutputLen = 200 -Secret = 21121d907788a55bc1700e0c5338ca8f6b8794ad7bbd8def7b51068e65a3065f -Salt = 51acba98e187af20d315591cc0dfcad4d1007d3186c816a1d500baa925f0688b0e54591d36b35bb3ad14ef1fc50e2acb730822 -Output = 81922ef7256e9eeef77059695258cfc15f55a5e656a5f099a2594d96ff9181e182604ab63293a63de815a380285999c36845d948f39fdfc14a817d180e1ea48159997a34ee108fe5fba5d3a6f841286aef140d75f75fdba92451afda633cc397ecbda2990a0dd2ea042211bf1f8b6db8776be6276bb4706daefafaec7cff5091175bcb494d7790798c8cd044ca7adaa08f650093b654681eebcd9dd4a4f7593ec55137d41e7cb03f89df2eaec7cd0d5c2fbb983c55743aa55d3e4f071b7fdf7f531fcdf7b2e3cd20 - -OutputLen = 200 -Secret = 5063bff7b9195b9d99519cbff6d3a82003574e24d15248a2f0728197151cf4cd -Salt = 4b062f2fedb7810392e65bd9c96b680bfff7e20285e7ddb879af3659ad8cfcae50eac6c71811b67d781553510ee46a9952d425 -Output = 435afe0808767f960403c6f6ca46b83366ff1cf5ae48abb19fcc29f2158a9efb2fdfc80e54f05306b0064f26973cb9729daefd01052fe396817285b5b76ea887ccf005c518bd3f4c476ebd49edef088fe61b374ed99e27b0b5daa647525c4de8aa4195e5a567126dde54704ccd6296b5f9aa5f6ef928107e9e475b97da5c3f42d7e58593a3407a1fa393ce7cf341444ec2afe1479c04d82d6b70714c7b2e05a604d6112a6a065b14231c5dead6e4919b5d4b9a0cc2e0d23a55f21ae79a0b5538d98acdc5220b7307 - -OutputLen = 200 -Secret = b23afbd2e032ca4b2090673c12e0f7348e54453e77538bfaeaa4a56d1d106130 -Salt = 822aea7411781f122dc9f26d07026d0414ef4d04a25918364053985f398245767072cc66cc492a49eaea183a5e2a1778d06ccc -Output = 4a538d838a777e3193486cde2317b3b50b3765f5403803a0b5f777b464ce67acf82983b6c03e7e20268d9c2f761658c3b02c1b7e0864a078b2cfc552b7e0a1bdc055b959c61573e312c20778881769c8b8dc0245a6ade030bec67121282087297e6bef8079782ea5dcf1dd8791135a74ce6d36144403b68c9680a244a47a3907e781d49499bd28c227afc497059e346d91b23550987324eab23f1544c3e88c0ce95a8ca828b75a145712a28918f858c153c810cbc25d75fd9b70e159848e40daa29390f1bdf502d7 - -OutputLen = 200 -Secret = 7d7829943336ac2b7e0d1e6faee9dae61a2070f8e3474d4e7142288ed5808597 -Salt = eb3e2777db34f468fa2487dc2dffd4b71ea53754ffe40f277bac1c5d86ddab8f777d612424fff5cba02271a890cb54e8c130ea -Output = 3aefeaecc983d0cb3aac0e54b217a49ec999d738eacebe84276d50dab65591dc759632c01f5ae1215a21210049b1b01b37230e181d46e43cbbd3a33ce670b940053cfec3b60013133e7d8af148b2eb6be629213c8022104fb6c2154040b31e5a68f35ee7487800ca316675d03dc1880b14ce77a3aee4ffd2dd83694cfdf386574ef0a132bcee24c868e6f1579afec95f17963a09c40fb0247a17ed37c639c444ee281614d57493e8a37b38e89c4819db3811ef6c4720dc744c0156bf80ced4c0bb1a06651a8ba10d - -OutputLen = 200 -Secret = c5c1eb43d0bd638a5eb48c14754f172a210d45ed2287540b7e5a45e88f5e595d -Salt = 6b3d8bb7ec4616be9fb8d796f7c8a72872acb6b4baa06521f357fd7953f129df2552bfbcbb755ca9da73a3406734cf6ad85129 -Output = 6a8ef609d42ec1a1ddb44929e61e0249ac4fd2f3408ba8aa134f1c3959a1e92ae233d0861196165b9aed83656b3f741c31d8f8e61fcfbb491317d2301a7682d451e5ff0c390b01f9305f97ab3fe6275df41946697e90eeaf58c7d0487b0376cb2b5f2ee46554ecf1bbf1a93b800dcf5df893bca803473ea4c0370905f05bc02deba42b73be667fdc57275c2078e65fdd8ed0dc63c429230405e6a2e2362d6c3a4c650aa9e2197e7968496484976bd21726904e6182cb4ce6a390c8cf2f1ce67d2116c5814f2e5de6 - -OutputLen = 200 -Secret = b70bfde233930c3b242020b324c1da1321d58de1bc002effb9d391dc452be3f3 -Salt = 50b8115f0d8a6a42a9ddfe5f97b51194c0cfbc0a22463a0ee1f6b0ddfa2c6168dccdd7ed7123420c789d9521264043c7008290 -Output = 2067f35162e763a8dd1bb8ab201e3cc98c0bdfbfab4ad6d4ad5ddb3221c499dd234f512a9736c373d1995ef8fef371500fb3a50f298f58320b18e7a92b94aa6a189b6fa771c6384a8be0e01293a0a708003b8916455db6a71c2c52413493d4b46f81bdf1118dc52d715d586c0d79bb1037f059ebba9027aca2cae1592b89f1d96de9a0cf3cf5dbd66afcc1f3b31bf71ee36c033522bc3b06e13d12c3d4a02df042ce3d090d5f09c04aa08c2926c95fea2497aa052d781c9ab5b0fd2ef336bd0e5808adf453b50d79 - -OutputLen = 200 -Secret = d356fe5cfa6d2f49ae83c2a3a8652aad76b8c23bf0de4027b008f5b6de18ec4e -Salt = 0b1a3a6bd5468bc63aeb8afe7d736966a2786fa7ac30cef48a2d901a477e656006a70b28bfa6c2f9e36e89aed81fd617e7d4a0 -Output = e2756f8625bc56989d93addc40ec3f8ba2fc1a845edec8d034a578a6f014915a9a85aedf944539d959a319bc0b9fef57d136d9f78e943951192ef5a5624348be12fc5d93160ffdc6b9ba699a242ddce0ff8be0bdcc8623739aa4177ec17e65f5161bfdead5448d3352ad15bba438113df8cb088b02a4f531420d3f6632cccd6dfda005a272a54c8a503d510b08afee0912ddc206f10a7c171858cca700d1d9b64f166047ce0aaec148677bf988096a48b7165fcb48a194d01aeaa2e38efd2239978ced6928d7529c -[SP800-108-Pipeline(CMAC(TripleDES))] -OutputLen = 64 -Secret = 1942edb18c60b3e5f7f828517218196b1414cfd9fc913e21 -Salt = c47cb4cdee7c3fa4acddafacb726a2d6a2d7c724fdbec0af7d24d10664d9a5d3679b2996fe70d8f7f7fb61fa069af34af74cc0 -Output = 6360ac8b93420edf19757e821a891f12dd73dd3610af374e90de199a8b5d440c5c3b1995f895f8c0e0863ad1d7970c8586c709f54bc7ddd196ceeebf61fa4d5d - -OutputLen = 64 -Secret = 66524b37faa26a7194da0a257480d6f6e789783380d2adaf -Salt = 93408d2c301bc5ef0672d65198a8dfb2d510d7007c0e31fa99e05707be8f746df2f51bb52af844ca0885c0fc3b01121924cbec -Output = aa8169e6d73b0c8d44f87023525b3213add9b8973bccee63a78750d762477334c59304968f839bdc2c4d8f024d2f3c09fddefd229ca91b76df70a52fd3f76b31 - -OutputLen = 64 -Secret = 3277598d3782506d13290a55db1a6fd01968fca3c70b26bf -Salt = f879254bca4601878a0a353dadb7d16d2c44b789840069f8182fe15ff8be1c92aae5aff4b22d0a66e2c9649adc50c190d0fa47 -Output = 246ee08976bc3b85d55761d9d2a9a6f94a606b461e7bac804dce8844d6df7b11e06e10c34ce2a61650f800930b553a5d55eebfd5ea5aa6e5e02f4e54f6b1ea82 - -OutputLen = 64 -Secret = dff388413205f9342d7248a870e10a9ba766dbd63959a7c2 -Salt = 93386d6c509648fbab4d5b893916dd28f4458e4a60c077717be15d177c84a358d71ed1181d7c9f145f12e905f5161e79171b2b -Output = d15ede4cf3168c51d9581c462ca0a039cbeb8005feba74ca624c42998de7f7327caa8b69d8c719a66311bd108f9318d88d7716fe3ff7b09bf064070bf38c29f0 - -OutputLen = 64 -Secret = 3664dfe4bb91ff31d066793b4d3dfff3b268a2250c2d75c2 -Salt = f12a8d873a838ee08aa48aff698f24eb3e68883c59f4e332dcab97294edf60d9ba38b6708cdfa585b19b87a85c9909d98f34a3 -Output = dc20c292bd8775e0848fc75a09c73700c1ebf4fbfb5f5eb079b7560dc5f302d7f74f0b078264451c551ec2a333b178863b768ae4fd0f99cf5defb0e3a38edbfe - -OutputLen = 64 -Secret = 60fd935a51af7a85b76aed9b90d167272a90473fb98a59e8 -Salt = aae09f15a7b13dea08541d53af8788d68b1a2b8f5917b83748d112c60d4c6b8e2ae0423a30b31402e28f739126ea38d380a2f8 -Output = ec1d58e42e306214f585dacc0b9b28e756f2637045eb1cec37511b2585ef4ae8a0dea753a9b4fcb23797da9da33db290e53fe05ba15f22bf4851c7dc5c5f11ec - -OutputLen = 64 -Secret = 245751d7930f7bab0217269f31f69f980f95eb9661d7902f -Salt = be329e4ed0afc94a738be635a902815a333a2b50eeea8b1e8f72efd45b5cc3872149bd5f95f64266c68487c3d7a29b83e7dca7 -Output = 9351723d4363ea6732935680ce209a27b722ac0939c731c22a059642cd551cce2836944c48f24db55bc7f33cda3f604faf512735a629c9ec8b42a35585017b6c - -OutputLen = 64 -Secret = 60d33bd136cf6ae58029cd824905525f1459427799906c97 -Salt = 6d3bc72933b0570de1a1e21f86bee297f93f1043c3fa753b541e5d47e79a06fea9e25930514a14c2f4a0e399d9f8507647360d -Output = 4ec747a6cdb85616e9ea5ec278666bd51560892a2b73354969342a82ebd487c6044b68feb5fbd6c0c91b81e63b8a19f6fe237752108bba2504a938b1a6709f4d - -OutputLen = 64 -Secret = d9973cfaf0065885728c58e46d968917199dd136c1195fcb -Salt = a38fb0c2af985f41018d8c452461714df1e3215251a2999a66803e35ac83b041a2be3d9ea567ebfa5060b5776c487e92cae7de -Output = 420938a0c49f3ef1e5ee64c9c8aa2794c26eedf1119c8f4938beb2b40a0414f4055f0f8f8c39ee8158c8ebdca96f73345fbb4d287847cbfde6224fe887098e32 - -OutputLen = 64 -Secret = 9899341852473bd2ea9c6fcc8c01ac6ab26038100807d6f8 -Salt = 2841d405a9a74be746e4bfbfd57716ee6f0d3f1e88e62795c3dc833e855950eec491d8182b5eb16e8b644ebd690348a2b0397c -Output = 47bc479a38f43f210908799802d15728cc38371661c03f4a4b87bc549664bba3d7046228055fd00660bcb0c3d27f651516abdbbd1f6743a259f25e7f8eecd93c - -OutputLen = 256 -Secret = 2627163784be8d59f2d1a54620deea24376e8b235aef3912 -Salt = fd489a25dee1c0a6c4dcaee2cf75c18bd931340fb940d34f262b279f92513680ad7702bfa1eb6a9bd4475c6b68474c15f87a4f -Output = 8ff09d35c55d38445971228908ddfb29e8d7660a752b40d2cf1d6aa894346bc1eaf787aae31dfef22ba498fb619cc5339da7e16b3443d852a76e19ff61f4a7238c0629985ad42608c1096e7258dffd5de8cb308eb7ac88de624d47ef8f12ab6c350c27985bcb5a0bef7134e2e4c25ac8f07dedf65cb50f1e73d67bd75feb8740d68a68d38c20a3bd872654decdd38117476ba000b20acd9fc7b1fccaf652394a97803384b9e8f6d3243133a71140317166a9a44a6d103b9b27a365af2ca194875f3291a21c3a3c842932805fbcde41633dfe8467cf7736117dad93e473cc418a1075775617a3e4bb10c6faad844c4ae557bc1255b32d2ae2a827742e2a48c375 - -OutputLen = 256 -Secret = e8fe86dcc0fb8e26ea0899082078c430ae313cf3f603068a -Salt = 3eb02e5f3036304e1d34ec21b186fccc4d28cb63b56e81b83a989d0b06bcec034c47d0d6396f9c483a1f7ef2627ad082743b52 -Output = c72c6acda06a1e5b761ff49380034dc2d3f4f37f55fedca4ad232da2babe1c23e3220c3218916df10d0abd22ed4af5fbfc634cebdbe9db6ebd94a5f96d74581e547fc5f6abab3a7c0b2969315d3ca66ea7f4286b9c57ae90b0fb1e63b1c78e72178464920425636a30c150a4f8479b7a554488686c2d0c9a5d355a3fcc5492da5f371d5cb4c24a3284cc6f2192d106074f6975cf5111d86846e8fa6350755081bf369e81e4bf1040a6c57f1d7315a91cafab77203775a2e2192489673eed156b1e45c1609729ef6e6e5334abe60f9cb544ccf7cdc08bb5a403a2030f840816dae13400d17ac55f02767ce880ba47f2abfeef3abe594ff634ad0244977648d61d - -OutputLen = 256 -Secret = 48151af025c9a4f3b6ba30e67473fb2651c89fee5b475520 -Salt = c1c356c92800b3d69a6936d22c26be6563f4fc50f152b7e510fc12bef54a47d040d5294ff98a5eb6e6bd0649ec9e8da6fb673e -Output = 157702c399de2e828b876f3ea573cd05fea60d3a1502a513b2386bd2e3b90fbfd8e8eb4360e9e0f13dee94c22387afb7b77405add04b470f3afe0adefb55b6138afbcf67e316f7dc9603955673910bbd516c2d31faf2a0bef426ba3c32738dca3370f4225b1d9786292c06496b97e2fe06eb465894dfd99e899254c09f93337d4489d9780bae784b613ff5d4d2a1e608345f7680270a2ba5ba6053863a798bf6c5db7243ee8618fbb5611de6085b9bb4c7b248f3c65e699a63d373f8ba78cd89db5f2d51bc709d65ce385be74ceb3168c772c97b82ed52bcad934fe1c56e0d2e5ca47f13d251eafa7a1ba299315f2c3e2a89dba7b8e8422609dcb45e5808df59 - -OutputLen = 256 -Secret = 4427fb2233fb3d85c3805a18d692b5fc600a0c545110646f -Salt = abcad9a8669f49d24d4b920c27f073c61a6e56295f46cab3d653a8169792cfb8da992d0d50e83df8c8da958a9a3442f42643dd -Output = 501bd3e38a5dceed97ca96371adcd74686ed4ad2097cd62e20cf01a3384b6b9765b458f1d3067d008f2b25719f3d9bc39f34d90cae2d91fd117f79066d95b121d04b6990baaa51d2b3b6b91c935278958bfc68365eda6542e8ce1b67d07299f3f6c7614d4a84599b3b14725e41fd6fcb1786173da0b6447b3dd436a6a4ccbada2c870a45a29cbf263fc4a602969daffd4667d06a2b46b575efc56c074edf14ba236cbd1901a7950138fbba79375d8276d69c7ac4a0bcc78f7538851a46eb24daf3190531a0e7fcccf6736e3bc54d8d70f0f9227c269ec5f6be297db24269be7644f814c5df665c354b22ce0845e6ef81ea70a316e5fede4c80332911218f5439 - -OutputLen = 256 -Secret = 81e954f3d678572d62e153fdc6eb748c6c71a710d87ba508 -Salt = dab9355e2761a044ccb53ba7c9b789f0b204b48749363ff6243cdf1022ce01a60b46fc3d0cbac2a015c1522528bd89e448d33e -Output = a5e7016d32f7e1bd58f7660a858ec99b90d8bcbdfaf64c1cd9cfdfec17b7e2778da08b6966653341c07428afc8954e45a441ec6c622f9e113d9037d9b0f2ef6d58364a42dcd99e636cd42671a45963e90b519a2eb65fcc0225bc9b06f19150bb6712caa9e44068faccba8ba9f6590857e5cd10d9215148aa59283eeb245974bbcd5a9173dfb26e51a57ec6567404f5f40687811835f9100eeb3b9887ca9bf4d28dfabaa91cb238f557b638104011564d19602f41adc98303a33fba46288abc4508d02329115aab64aef14ed52676bc405830b407485c8a8983780dab2c8ec9a40db0dc190e1e2e980debbfe1cb32fcfb97c462f66ce5cce618d097133127c672 - -OutputLen = 256 -Secret = 585b3112066299c213e7c2868d22de0d10aa997a1253cfb7 -Salt = 4947d91656aa22e0843abeddd49ba3d5d54e8d59d7e79e927fdaabe4c3984dfa67e3adbd6963f50378bd11da237e9da1a2ca53 -Output = c904a5545d2e362688ea09c5bcad49fe2471c2755b3fac292855577a567d7e529478b35574bf72b6bdeda40c425d29e95f4a3cf488d7bd8705674ac67d3e7854e57f30c76cf6c812132bcc7cddc1e09e574f058609495fdef7ed3da172f78b1dc81a72f07b55b3efe928b04edb165720c8b7a59373646f1b3d7988f8ffc78f83cac0c095f7e74d8fcd304d4f20b66a56328d72284697e266f087ebde2762c1da025b5ed86d50537ffb2c0c3319c00d307147bda3b5f814c3dd323cb61b78f6209a578e0f441591f8d7597e5bdb0ac8531976d5dcaa39d1c58c0dd56ecb43313184cc4b3b09cf06b1300e76a91070c5e2b363663bf80026323b029147b4197c6a - -OutputLen = 256 -Secret = e510dca37d7bd13171782b04155b2807b0e5715b9e3978fb -Salt = e449790999c17639afe3ff0ca58d33355137dc0a4905b7327180409154ed872527f37245398f88a33da75b7d30841303331a0c -Output = c4aacb14c7f3a8e5733d7be0f8f64b16df76e6575f6928316d86279152f0585642172439cfa59d0e22f383ad76f00588c787e073385fdfdaede866df580e0590fc48eb051dab39cecc94ef9ddc5403312202004feecc5e1f406f2b5c442aa2f7017e0cbb5af74b5f149388414ce283cd01cf56e1003e8b934676854311216db91106d296a9191654b70e25b573a5558a8cd158d119cd055ff74f8329f7f66a5fc19d69ce795b8a8a0eafa0ea006aed6792ee2143e0239ad01ddb1cb79aa1a452a25b18b22cc44a02249a86cd9d73ddba68badc03db01902fd674fe8c0d3b78ba82f284e35c727cc4e0994316d3e8efd7bf067bee4b3c5a76c93adb8341ca85cc - -OutputLen = 256 -Secret = b026af96072fb746cc40ed7c3dbc76479f0a06188b516300 -Salt = 9810f23fc2587176a52017809fe44ab82d2c37d6e1042182b6272ab7cfb57e528e14754d01251d037ef207566bd47e205ef499 -Output = 8530f27af41ca6afa7a55e3ef3b7b77dd4fe7cfe8bd190e760a67941dd88aa017aa2d4d61657bc480e4a9c21201783e523ce07ee9efd4136e0b9ca0b35d0a3a15d9559c09043f907aa7db9a0e591f8faab3994a5292920096a8b00c502bf21b0d636bfa651898ad452b9aa9037cbeecfc3031819ab7f4382c5b44a77bb11d9b5bcbe2b048e6bb7dffdb41e69f40d40340134bc8858aebe59011aa510201da3c0c4208c87b43ee634ee59bd8a98aa8a2c1c941ad2179fd724ae3e52439040d977c232b94314ac623d27a07fb864e60ba5bda9cdf318d6a1f70dd34579ea147467d4f25cc22c83c55dd98e7143e68e7c9eb817046a899d0915894a95e12367d0d3 - -OutputLen = 256 -Secret = e1e45635e52f4dd53588d3a23eaddbd047e173762d394777 -Salt = ad1f6f2be616d322f15fda9f80515c98d7664234b544fcf8cbc1bbca1851527929a5650f8ceadf23aedcfff510edd9ad21d11a -Output = cacf55e7ebd14f8377e64f6c619df59b1e23dfddd6ee4012bd7381b12b8731ed17ac1cc6726983ef0235731bc17151085a5e1eb9004b5129b2f85b4300c08db31d8bbe6498bd4a30772c56c72378c67d8e87d469e0f58d969ce02965b5a0642f490952fe210da4ed1802feaca61b5f7378a807257d3e02e97cde0e22d026b7a4cda66d79137eeb9100fc9e1665c1a0ce5feadb1febd039fc8b5d7aea21febab9656e4a3ded89875e8b845eca4f58760e7c1d048b88712455215e000abd7b50cad7d911b51a0e086a6f183f08a175cb268341b4f0bda8f8f04e9d8ada57230ab1b1ee5fa0b0173e7780b2a799686f49ec4924d04422fc66a85961ba62c4d2c327 - -OutputLen = 256 -Secret = b342d2589fbf8fe9d477d576f6aa7f8d4e703983debc0174 -Salt = 8565a7ec5dbd9ad5cd5d5ad8f09766397be9314996b37d8c1afe37dad4cd987f4961f31d7d9197ed5226546100dfd103eda2f9 -Output = 6f753c61ece65201af8e30b62a0a2d682cc67e9f812a3d5428d2ab8548a1b3564fba76178b5f053edaef5f693dd62273c071320d9aaafdfd70a8d669eca0e3bb63ed57385393c355799c9412a4219d3360b9e83de02df6da94ecab84a52c68b5625ff1ac409681d136927e49139cea88ebe173ebc00310fe5f74d4fb5592fe3d7fec0b4141cd51be4313a1eaebe148dc1db45432d358baf1285b274b5588bb5bb0f70513dbb00aaa11ac3aaf54df29e94f2146f40511962c704fb9aae2129c1509b5a2fd54eaf0c5b38846f951c1dc0ff22c049ea116ec7f7a166a2be8cc3ae441d6adf1bcb3d2ba1f30dd7b0875d31151a81679066c765706e8abf41392401f - -OutputLen = 70 -Secret = 14429b432ac3daac6b5ff7c4881ce90af21b3515877cc77e -Salt = 3f7dab9f6a5d583f24109246e8f8dcf05600d10028a1cf15cc4deacf861901bb1d6d7671c868134b42411e935f26ce470276ca -Output = bace3247d3d7dd7b642835cacdf717355e064aacb42273e3a2d177fb95512005934b02ccd682eb48e89a509ee2be4da01445534194c0d18cd26f5d56a1a01f84944c326ec286 - -OutputLen = 70 -Secret = b8b25539cbcb8be2f8681bc2d6ee93edc2c3fd2eb356a5bc -Salt = c8ddf59e508345a1b081b705ecf074e4a1fea5768780d2e82d40c4327df5a4c46eab54434672e345341484c83d645fcf5975b1 -Output = dba180302207e99f4f7f4899e3e9c58a79ce321d1f2584c2357c725aeb659e9d4ab871f9294608e6ffc141116b4c2bca9cb195f02e83c3003ba4e03db60c014b450b468c3db4 - -OutputLen = 70 -Secret = af977eb00d702cd41540225476bdaa7846762d6025e4771e -Salt = 07a8263c8095d8feba9a25608fd739b90fbc9704ad22cdc073de49f0e7905d4bb7552f4b04f5e8cc054575751e724ee850096a -Output = 9c3aab00b2ec84d82814e7ccb3edc69900c21c4d89ef23c5e56af7aa1c1ae71053d928b480234148cc5aa8ad0ddf4302718f88eceb0bd44450c0b6b6cad86d4c63b85acdf409 - -OutputLen = 70 -Secret = f3066ce3053862992eb0ce25d530761de42d620e0a4f9751 -Salt = 9ee525d3b4539c69eddebc4829e7e1e1c3750a3e78ab934435875aa4b41f7f0a7c8c749ab0ec2905b7ebfeb5f5bf4d9cfe73c8 -Output = a85af50c2a1c054629328951d4df5908ff7283689e40bee6c30922431720700987bd86331655a9a45fc271e77ff9ab9c4ba168d830c34ff197f6d6094e3be4413d1d8d000a79 - -OutputLen = 70 -Secret = eaf0f4d28066e91a02fc90cb5c41f7556ea345a8f679a677 -Salt = 409d5e4217e88fbe9f48b7e7087b91cf4b8dbe7275cd33345f0910a9bcf85c852984bbdae1c3c6533b247bd160ad251f1d76e0 -Output = 05412dba6627aab7275c52c3aae69fb04b12dbd2ac6b7b920269abd755cc86612d74b73cbb019d12160b38feb5ab6ae1364728befed773c62a81fd321fbdb25c2f94ab0fd26d - -OutputLen = 70 -Secret = 80d07aa075013e0ce8954d1995390d6bc9124a393c61d97a -Salt = 2aa1099f4ff3a2fb46227a6bc1505949682e1727d60ea9b7c95ca7ce5167c4dceeaabaf6f376a293d5f54d4ab55ad0ffe32e81 -Output = 8722da1842b7f7a0197f89058cd80bb93a211810836c9f25055998396ab14c6165444590ca0db58a5ab0d5839bd384ecc458203ad649337a17af00c49dd2646eee9f196ea66a - -OutputLen = 70 -Secret = 54efbb89a6146e0edf8cf8fc815ca8d2966af76bc007a39c -Salt = 4a50b7fba8bd4e0b04b205fd4257f501319d0108f05600fd1ecd8e92fcad33f8d811f6110ec6f2e402fe2c4a55317f82b39928 -Output = 16f0eb41afa0105e57434642e5db3fac8f2f429b016c23f45a2835248f40dd175f13eea6a8cfebe0fc1a2ae2b6a2462402f00e297131c1efb9bf84bdb3c9cee931f739c7a42c - -OutputLen = 70 -Secret = b8d0532f12229c0c732e1721019aa72816dd93a62db57976 -Salt = f4e688d7fff77c3fad09915cbeb780567cc1c14dbb2d3a22ef777e108b036649baf0368121ccadbe4b825d410389a2189fb10a -Output = e24f10362e1f28fd6a721c66681a5f49a0e7d69c1a0d819a8ca7cc81e07f0bd53bb74f2ca1e9accbb01640e74f0a863d384d422cfade87fc0874b04cf4af8887f6ca7acaf3e1 - -OutputLen = 70 -Secret = 6a6e0a0f6733a4aa06a80f57cda7e5a0147f9bc06e84caa7 -Salt = 5008a4c17cef6ff3e4706b008500aab13744768a031bdbf396d842bab55517633f3ce9b4e697ef17043c6c61e446b5d6da3fa5 -Output = 21405980e34a13995e225c344d3dc7ba15e4e63fac94eeb3c645d0df89b47375002b50da1eba240c9c5e9fb7acdfab82cdf36cac37a0b5beb0954bb2f36672e7b3464509cd56 - -OutputLen = 70 -Secret = 3719398c11e75aef56f99287b5d67b1ddcf450bf3c620a04 -Salt = dae1cb0b651327148c9025c1051f4087b8443cdb93220bc6d104d24653258636b0bd351305e7df6d12200f7f4ff539dbd37440 -Output = 4d3f9abd27edc0065738430e76d1fef0c5412090ff12ef87ae122b7d1f239934eb35e6a5762b9cca7e46c3c24102fe68f5caf6dbd1b86e054367462db8f22cb5ea30900f46ad - -OutputLen = 200 -Secret = ddd02d54803e856026fb881f35f8866ff88b526ef7a41e3a -Salt = 32a0260c39ef282f1c1e412deaedf275048050b471b7d9b953815d55de48b153e0b7125d58f165ef05666e36631febcaa81a44 -Output = b49fe01ecaecc52325cdb22bf68deb1fb77ef292c01fbc33c6fe0097ed6c3dddc1196e07b64537c2badcd57e7344fe74996c061ace7c0a7c5ca11259627d8cf1d089055595d294651e0b9dd69d3fb37e9fd0b715133ab85d6f0b2c1348ac13cbfd8f3ce1361de039eff8c0f10db82afa6ec94b00f13068fd5d88daa0462e1a8d281b0f05d9b52e86af0822f9099c6a04a00be2676ff848541a3f61940496aa949384d39389147a314afa231513e1af1aad2aa1d8a3f9166284b383eb17315a5b84e1f01d5fa3a97f - -OutputLen = 200 -Secret = 4c8d42c26f091c05a3c76bb8dd4cfd5ed8a5f2416e9305f1 -Salt = cf8e37e75513b3144ba7b57542acb32b83e4de71dbdd3f64055ebca774cec4cff69f36ce953ffb15b85cf1631a65a60f236850 -Output = 3d706d1e71a7fe59661e0ad0a3364850c08d0a99f2ba72c79f2a468c29ddab11b9f16d3540095d4986b5fc7295f6fce80271d0dd7856b7ea308de28fac10eadf3939d0170de2f7f539bc3de59ad22dd7f776e3689b16e59e9d4b8b6c045f77d6db02ca9a6ee709555258d17db32a79f2b46501dfa17034557f808af1da9bde2933f600bc7ac584d47f504cc4b194fc06dd69758828dfb39164a505e6efd10586dded4fde9716d59679e6753d264ba3eabf4777c9e52b24b597f88740b96ad2951a429fd3d05e3754 - -OutputLen = 200 -Secret = 2172f2d8b02cd4053ac062ef8b53c439d3fb0c83ca63773d -Salt = ad260d0ad3c1b4cc980f97d65614429f8ae1a998001cc7372957984feaf45b49db77be74308ac25f52ce40989715fce99080cd -Output = f003f34a7279e4c60dbe6063d8ea041c91da4f60e4ccf910fde3931d01cb588b3cfc3d726a499a9e7e91256935348f3b63910a552b0fbb94e5404adbe95b130c645c2565d5f1d1136591cb9f0dde6355568e2e082d1adeb9dc40c997fef7f9ba6dba90fd94b6016c4e7e1a2a79aac3137ad77a43f18b4f503655ad242de789140970616eb59f61d2f6640fcd0e8ed9e12f26344928e4586856136191bf84ef81d40b5efe45f29bd032a507d2a248b37140a4a49a5f73e791abc153b0f97f290af569087fe130e73b - -OutputLen = 200 -Secret = cdf081dea2a489cd35810fb3614311c92af2cb6e3f1e4c35 -Salt = b6cb7d0b04b6453ca64756f829e49baa60844b207753ecb0a92ce6e548374b585bcd6acbbdf483ad1abc69d52ee135c8f67853 -Output = d8434d71c6101d6ec3cc61772d2aa028aaf74d75b4fb2c88ca2520dc977550168e55d17b3c097ec8e14aaf7b4963ee3c8b96fba7864a5dfcfba7cfd5b81fe5f534a5260794a510177b6634da25ef1abbb428700d7c5d530a47a333bd35e10ce5bdeff388db2c57811d1e04ee913904caffa9532d7784f58876267608b2ea62350850bd82fcaaaa382df618007cfabc91bee394b86d2459503a5013ee555ee8372cc44c105aa5ac02c25f95ff06fe91a74b9b8b9ff0a58965e24dcac6d13543a5f399ebf96ebf1434 - -OutputLen = 200 -Secret = 06f78c406bf3a1ac49202f7cb9f001144cc040cbac5fce2c -Salt = bf795f0d354294b230611f1dc0c634cc2353eb7103e8f06449e3ae65acca7635f52eadb00daa94f97f4a94c2572af0dfed930f -Output = 0405cfebdcabf6220744c3369c6c356218c69612b4190540a9ca7fc1e42f3c9b761e7f599a77ab537f909272deb0d7ac44eea41a3cdab03f619217be0937300d73b2a1871e12ec57b80678bb5d6706be04011de81407f10e7ee7851bff596f12a061fe8e14f66e9821f1ec90cf65664e5825e8d65dd1ad0ddda69824414a0b163c7c365adb9cb9e893519c9435c651de319265109fb21594ec5bcea1c6c7fa9f3884292a99f07546392fd2f5789b95b3e15df6eef4efe10aac5623a33bc743c22a74fb1a01d32811 - -OutputLen = 200 -Secret = ca6ee30604209994310940f2e696618d51996b700add7d2d -Salt = 72f8c6667e3d6abbc88d4bb4997f391522df39e41fa9c33a93949a0a050a07ce733b4269e2fe2bd0246529851a50fea00afaac -Output = 4b3321ca6c159acb84990a6fe6a81fd1a33b7a69c2b0331fee059f0a073475cc251d48eb6b0b13de88787f640f2441ca90eecc2d5631d94636dd8418a459ab6be0bb5ecd5054a0db4a00945cb8b7e47e5b9775fa6fcda98c35ec4c4d51e53750ff8d3c39bf5f8d212ebd7a1a4370704d82b9606c6d4cd45d70251214e579843b60e38078559c0f5917520484e18659505a4b496c93cd3d20559df917e3e8ac5170147c73011e7685fdab123fc83833d1e76b4198409ed5a4ce36e8b9a84813d6bb9fe4d7186bbb11 - -OutputLen = 200 -Secret = a6ec92824ccd7e536fc6783b88a46ee6c0c293b8d307d432 -Salt = 293f1a045529437099cba7c2a98701621058da84d1becf89af8239637022f092c4f8190ca66ece304ab2a92168093b729fd064 -Output = 8ec186a600eba3d4acfa2bc5793044799b29bda8de3091e9f3acb813b10b2db6495cdb95076544151d9d0d9a098f50a1497326281375290ef3bb9029897ba8c623229cb1646f8fc9884b8bfe9109ccf2a2db56752131a7c02f4e3f0fbea11a1a2f6c8ae220aed2df5651faa5eb4eb933937cc02c82ef7fd0a06d780062a1e72ca99343733490b36dfa45e2cc3ef39690d8efa0475bd6e4e2c921959fddb3e2410e32cb398a6134926795c2e65c7ef8daad5bd1286e412a8640ab23b195cf60a5d53c55de657561c8 - -OutputLen = 200 -Secret = a58eec79bb7583938160157360a945a877e947c669d532aa -Salt = 15389e58131b681734c86be4b7616222554e6dc0529c61a2cd4a3f2f77fb8a0c5eda8fe929d04ddf22a428a343617e48297e63 -Output = 0835c19aaa7b860822f678a3729231738e30cd45e22a9cee007fc39d9d94fe9292d2dba00654cc67819b3ae5a72f33774eb08d78d24804f40de2c6b11baf99b5f51d009d86d27a88c8796f1b9197261dc120e72e7e3b6d12705a6a9d76bf857d2433d63e8492994e80b52726bdbe565489db6938b7598a0ae0523b84b56cb2ebd7621e4292867fb40ab02907d117026322b807dccc2bbab8d0a07a712d4e5a9021d1a122dd44c5ad4cc66bcaa19caec7d0535b614fd0e50de0b98584ad1a4f284b12e31d17760b09 - -OutputLen = 200 -Secret = 3d72407ae4bfd60eeae21960d792663e19cb7cbd5b690621 -Salt = ca8dcc4122d2a0628f414e22e4649e3548d5c7f8d97a4873ebf6bbaec75a91f09593e2ea783b9d1cb5a605749f5776d7e4e734 -Output = 7d2563ad439319b1893dbe6551a91d08e6e9633880f36deccfa3d76bd182dd39abe8d26bb7a2a190309f4920ea7d20721521b4bd7f4c0de6e95b202a276dbdf78639845d36c1198086d56b7ab11523874498f1b341c4b0b664d91eba1bd504567ef186a7d154803eae4221c774021b08ab2f2f58db9096768f8f4a8b6c79cc27bb46a3666ae91759768c212b1461b941ead5b9b47c198b2ad2c030ddcaf32412c7ffc9c3abb4c9db5de37f2d758c1d664bd6f0075b9a8b473895fcb37dd87f31b1ec35b1dcf932eb - -OutputLen = 200 -Secret = 0a3247baa5455d65c5ec468a856f8257c0de21a3f6b4dbd2 -Salt = 39c184c77d134bb8b89238f9562afabf9cd5afcc17a7c1a3089214d93265d5d342e82e409ae21478c339d96dd650a4b24ff0c2 -Output = 71a57d21f38aaa75fcdc1ed45c295a759548b87d4cf82db1b2eb371c48c62cd48e5e72b3ae729714c41227976d7c7c06c42d7638d49679321fde9ab002237a0368790d334269ed6f2fc0c686c4a1063841c974a9f1c50a55d6f4393651c2b0c47a46fe04899a7f2dbee3444e438e8c23ba67a4941ba616396ef07ac6cd5e346b1c08d562c87d228025caab939383f25869a3ceb4efadfe3760e8bba6bb562e78894584b4408803f1f9cf49496b839ef1950b8bce18c31fc33cb82e4ca24c6ee37a5dda64d6e36fb9 +[SP800-108-Pipeline(CMAC(AES-256))] +OutputLen = 2 +Salt = 733DDC0E01690564490B +Secret = D947A26C0847D7E2083B04442E53162073C164296E7EB0B4D6782468FBE927DB +Label = 2A1641FE4E847DFEF0C3C5D5 +Output = E3DE + +OutputLen = 2 +Salt = 07CC8257D5BB36BC5760 +Secret = DA9C2FA068A980DB835A4CB64CDAAB7E167085A3458D3C692CC316098CA186A3 +Label = EB2D60F65A408045880EB3E8 +Output = D766 + +OutputLen = 2 +Salt = 4D79B0D206BA11C88C24 +Secret = D2EE1D15F20B87B492C5252514E758B3A11FE6290969A0E1093C8E2343DACF30 +Label = 75EDD913EE239E353D234B57 +Output = F628 + +OutputLen = 4 +Salt = 2DBF1B40E18CC57EEEC0EBBBCEA25C6DC4E1371B +Secret = 4507C93731AA217AF46A8D6012BF6B552F4C95A0A8758689E30EC3DDFFD82A22 +Label = 7275CAE423AEFA54B32A2B35 +Output = 52E82EB2 + +OutputLen = 4 +Salt = 3C0F3160365A2EB9C276E1BE70ABB71212AE5B53 +Secret = 3369B4E54BD0398696FA4F88593F0B9C0B6BA87586BF1C7142E215C2D0D90239 +Label = 19B570642F68B2D40ABEA185 +Output = 31671A3A + +OutputLen = 4 +Salt = BFDF354A4A5859A0499C5CF2204E2E37E46BA3E7 +Secret = BA6644EA693B484E407BC8C7C9F1A3733D0082BCDB03CDE5B8A0E176E290D8DB +Label = 3B11FED280246C79D3395BA5 +Output = 0D5E2047 + +OutputLen = 6 +Salt = 1E66EBF2C6F1257DF6484051F222CBAA1699E77F0825C14F6AC4F943E15E +Secret = 9AA3E82503F4D39BD681E12733226F9A45F3C4DEFDD7F37CC34F6D4BA269E7B5 +Label = 766CDA9B9070C57553218205 +Output = 90DF0BA02D16 + +OutputLen = 6 +Salt = BF0743A6E7CF45196DFA9F95EA2AFE7E2F34F4CB84739FE31F944BD3A640 +Secret = 8E5205B9A6AAF403EA4D43475CED4C3E5D8B38843FF3474C800A17124A3B852B +Label = 51E7738658DE02B75F363EEE +Output = 633E8F5FDF9F + +OutputLen = 6 +Salt = 1226BA13BCEF84FEBEBC73DE932A1CDFE6EBEAD547F142ACF57067CBDCA6 +Secret = A448900D2438EDC58BE6885F9A4F07BCC149322FF8E4EBC747D7ED5BD523AF78 +Label = 7B086C5533B98AB1B13A567E +Output = B5FCDE478E65 + +OutputLen = 8 +Salt = 2ED4C6237F270157E5F1C0BFDCFEB25F08A32AAB263FC2C112BB4FCEC97E70D845AF4CD123003F69 +Secret = 168047F84EE9C5C743CDAECF868C3441E677234F2661940B2BC67E1F795C16CE +Label = DB8C31E567BC97BEB66C29DC +Output = D11FF9FB01EC7AD0 + +OutputLen = 8 +Salt = AB280A0F25E4BAD8391B6A80AB5FDB1C0A7C3724420149956C8C9E4664B5BC6F6BF1FFE263054708 +Secret = 712D4C796CC90A9808D36D73FC9C1AD754E1D36B84F6919490DD17B901A8AA01 +Label = A2E4F7ABFA96B6DB98C61FAC +Output = 201361DC17E0A619 + +OutputLen = 8 +Salt = B1E4B7E2219B246EFAE9BAA270432D81392358F913D9339D7D64413335D4F44FFF06EC4EAC28823B +Secret = F8C15AE39557262216040FC37A9D8581715F5861A27226A4A73043EBA41C1144 +Label = 4EE177EC425E51979C8D030C +Output = FF5E740ED4B71EC1 + +OutputLen = 10 +Salt = B823A1891DA51C58A7E421B5D76DEBF16C6C289062DFDE5CF4A92EA9F775CF387706B99BCCA9FF8F4A81056B190F7D61CF66 +Secret = 2774C5AD057F01C507AFB5FD284C6D8871FF8D2C7590C64B88A60C80213CDF6A +Label = DF1DBCC3BE7BE773F829996D +Output = 268F9047253A6F2CE788 + +OutputLen = 10 +Salt = 40B373CC4044552C86FE989C28F1379C2EC4E5F2F5B2DC850FFC1E282EED9500FF0DB866855382FF2060A2F7223AF7F4BB65 +Secret = A3A5DB6602CBC2A2CBD8BC341914D9A762A30C5F14A120B984BA5FADC39DC126 +Label = C16217CC5E2E6C7B5CB0BEFC +Output = 57D8D49F10505AEB6ED4 + +OutputLen = 10 +Salt = 7D68B9EAA414F959F0D0A08F9EE8174B33B3B346AE3A70229F5C4CF9A26AF015ACFFDCA89BDA1670326BEF62585651F53B0E +Secret = 5A61AA29A2AA8384AC05D7DE17FBACF7DE1F0631ECD29651CC2062C15460AC14 +Label = 2D419635A6AFC3C1F7A6F5E1 +Output = DA89D1848A3A40213872 + +OutputLen = 12 +Salt = 32F80BA97A9E165985BA2EDE759E15AD113D88F17463A593B4528483D8FC1386D9297D297EF32D7DA64424E93955EC5C5CFDD0FFE67BD96E3D049468 +Secret = A09D3A9F7AF5997C59EB22A0697BE5F8084C1A0E6A20EEA3D0A0499E9EB45304 +Label = 26CE10E1EE8A146ABDBCE368 +Output = EC6795130F4F2F76327C0FD2 + +OutputLen = 12 +Salt = 28E0F4658D9BC976E7538C12A86156DC3376D688168F9991DFB967D9DB40F9B9C453CAC65CD92D126A188133673D1390C54165FAB85F5F53DF65F42A +Secret = CAE7E7B9A189A9F445343850A5AD9D486E7A44EC1ACDDEF44849F8939886030C +Label = C787A5C5D56C4F958C1CF01E +Output = 62D257E170E3082E45C8EB01 + +OutputLen = 12 +Salt = 75F57FCBE6FB6D99049A60640509E40534764371C3BADC1DB10CFA8D5C6E56ABA2AA9BD8D4F6C30F275B8C1809EB4894E3063B15BE43842585928A73 +Secret = FC71479106DC3F38B1C960212AF0C9B2246AA6F48193E38A37EE25CC57D4F6B5 +Label = FBE1B11AE2CF6072ADCC0976 +Output = D38063907E6368E128279086 + +OutputLen = 14 +Salt = E55E14D75C2BEE8BC73CE689F7FBCF07ACCACF859839C254E904444AABB05B621279804D1F5C5BFAB38D4420A5A8C397F4050A38FAB4E0B52E235751227EFA95DAB8B60B5372 +Secret = 27783BC564A04D55C4A3EC3B45B80B9FEAFD95AB37B049417E311252402EEE99 +Label = A6DBFB372EA43C8286AEFA69 +Output = BDA1E29C677CB015B4F8E6A66866 + +OutputLen = 14 +Salt = 280E7E4C807726C00E834141243F9A34341E8CFA719B86EE73C9ADB6960E21A82EC15A75FCC5D38695F8442628F8056FFF5BE9E7F7F1C8F9486B07964975C9C0E9159E12FF03 +Secret = 54AB51A887404D0A408B309A59BBECCDD409490CD7A468151DEE4692750AA143 +Label = 42B796FEDC966727BA2B558B +Output = 731FF2B0C7EC040926032D79732B + +OutputLen = 14 +Salt = 0BE2FBF66E76E790DAFF2465EE1D98683B0E15CE3CC69ACE61236E0F2EDD02040F9BA20AB95DF23438D716E8BF9F92CEC72BB0D393848D5B7F7526223CCA532F9A5C5E733DFD +Secret = E1150A9C00F74461D1DDA425B0D8D809190A96C79F61A33986B55DBE3C2A96FE +Label = 917D816D9086628F21455A5E +Output = 4F58FBCC76FD38B9D32E426EAA5F + +OutputLen = 16 +Salt = 1B2F2DE43FC50098BDED16DD9AF636E2C4D05FDFFD75D93FF6D8920F5B98E2B55ADE4809EDDD0FBDAF7B79F1CD6063DF1562111D923DB0D461BF6B3594FDB6927719342844E8C3F1BAD17883925DF3FA +Secret = A1F239D35CECBC76304B1CB922B4DA6C627425FBA8F7B7A1ADA5F18C3DB6270B +Label = 2FCEB143CFE219A77F63ECA1 +Output = E1C389A692BE4F29802459AD91E1A291 + +OutputLen = 16 +Salt = 623CC4EFAEE86F2779C135474BB813F3D0E6E48D06579D45D566F60E2F199F39A50BFE0ABFDE8501BD9690C2B31AA039BBB8460D2F696E99CD980F144B2CB54C71D3255B134EC6E08C77976AAA4BC392 +Secret = 70AA98CDF7AC6B5EEA0BB64EE18D2A9385C3C2A3AF45EF44D2CFC7E79829FE76 +Label = E6331E6332E38234B407682C +Output = DBD244A417B7B00B8C394A632614236D + +OutputLen = 16 +Salt = 75996B4FF06D2F5F5E25637C58596988FB0302042E9DC5EF47E66AC4441759C2C8BDD9B8188F530EF8A5625E38A12A22C4639A73BED29CA5157CD7449CA27180DDDFCC8D20630C05FBB748586A659549 +Secret = 22EA8894BF3E8F96A0A9BAE7D87B95C394A996E626A17E08A3FEF03FE16DDED6 +Label = 2CB3A35B07C95A27BB785B29 +Output = C992569D8A2AAAB51F493CAD32803C15 + +OutputLen = 18 +Salt = 7FC136964158C40AB4B49C245A60CBCED5F50028A5506162F3EB2CD8919E5CA075C47338F0D5DE457496AB90284AAB5952CB8D986D9D6329286DD4422D626CD3A131816DB5989F33D9ECFA33759C4CDC34755C6CACE85CBC78F0 +Secret = B9CF0DF51A4837C30A470A920D5C98C1C034EF4BFFCB145C78404A30650165BE +Label = 9ECD853B2CC808C7BDB59A4F +Output = E0C7C18C9CA3E2CE6C50E538AC53A0BE39D9 + +OutputLen = 18 +Salt = 9CE9D2CA5064AF80A982F0F9848AC90AEECA5E8DA5D0D7B54373E587AA4E74F3300BCED0A2376BEA70C0BA8E74BF46F5A8F26058199EFFE1C5DC07E6C08503D0A6046FDFEBA9283368BE55A785DE5336ABBE88B8FF9CDC7FCBE6 +Secret = 14BE1D890D1FA7F8A3AC41BDE09FB6A80859A0AFAADF00C0C75E86D432A49EA8 +Label = 1B81CEFC2FE84C8042EFCB40 +Output = 0002F4248CE7426C27412941654DD3AD090A + +OutputLen = 18 +Salt = 6CF2E0C8088B5C02E2898ABE94A120B1FAD6D91A04F0F42EE05465EC69539101CE9899C57F13C0CC38C9FBFA0C994B4C918D5924C381019F31E91D683B73FAF8242BDFEDFABD2BCF521AE3E450D5F60AA402AB37221BC7C9E7D3 +Secret = C844EC4E672752DF11C4D1580A774C19444C83AA3689655C47A7A99108BA4421 +Label = 0ABE755E2A5AFD167CAB650B +Output = CCE26F3C445106A63AC1CCA94CD7F5A6ECE3 + +OutputLen = 20 +Salt = BA4AFCFAAFA75E494C571D29C28C0B524CAFF6B232F8DD489E0AECD2C3D964D9BD9E80870C1B17F75BC949EA80936E84985C561C933FDF2573BAD8C855D02A37C4E3243937D959FA32C107A0D4DA9F198852B53FE19C7A3111466A8781B0CEC8CBE3A8BD +Secret = 3BA4A05F42FF981BDF612E99A02BD2E381A205FB41D52F9D682E7264B3F63173 +Label = 14614DA13549C39AE78D5DA4 +Output = D10B8B39FCF1708BF32F6DE61ABD30CD664ECB98 + +OutputLen = 20 +Salt = FB8F8228ED01E5CF5D930C238984B6E8A6325BB8F143B5075E49DCF1F49101BAE6B94B534BE48FDD4318A12B8ECE2CBCAD7B511BE411E0BF727F51CFE7E0CBF77FFC32EE37F097D88F257DC00BEB0B5E6889AED4E37F758259F41F54E5677D0F1CAADDA9 +Secret = 6F03A0F655E70CF73E5DFB736030D09E9CBAE804F574A446E00A304D77BF865A +Label = 3FB0AFCAE634C6975950A6BB +Output = 8567C4E97D137B414898C63B9931BCB1FE3A1227 + +OutputLen = 20 +Salt = 52DB1E3162BCDBB1E9E3205A1A663D0ECC6C627BA70D49A9D8E6017C10A29F496C2AFEEB9A293FD9164EF024B660730888105A26182DAA047979CF21DCC2A833C48B1A3D7E3E59A179F340A6B122C6CDE2025A93BD4E1CDFAE70605CDA05E60CEB920CB5 +Secret = B852048FFF2FADD26AFE3EADE78A7EC8E1AF1F18274B0F9B0DBF3259CCAF9BDE +Label = B866317C71F7653D8A0A6753 +Output = DDAFEC2A7BA2AAEE7285A4753C7E92F075CB54B9 -[SP800-108-Pipeline(SHA-1)] -OutputLen = 64 -Secret = 3f9b0ee9af55a9c7dd03a9b94d14f723c57ebc80 -Salt = d072853de0f04d9b1b3831d9cc51e1db23108fe73b9e5c75666cdfce35b7c41c824f17ec2193494b09ffae697bd477456ca51b -Output = 6938a2b1f8d9fd41700af6b4b1b30118abdd85da95ef095b13feaa6318e733683aa6aa3a3b45fe7084235e2589f0bad47b2afc96a366bb3724ff2203d4452140 - -OutputLen = 64 -Secret = 503277187b09c892d433a9624906c362108ce491 -Salt = e87b702715417ec276ab53bb1abab901874ec951d9713a3ad5b3f895623bd47abc2428b89bd1ba50a8b91aa68295732c9f1744 -Output = 3dbf747cfb36de48102a11d2eaac465e49140e8862eb571d49e7832d8e715a7381dcc3c6d60e590b77b69360109add1d5706561342c7bd2167ed97fb0b754477 - -OutputLen = 64 -Secret = 35642db7e0cc6855cad29bec5fcf6062b4621e6a -Salt = 851b9ef8f12315ffe5eb07fff82507a1bdaae7420f254de3472fb40b46d2ec0cc2dc57da49c1bf0cffc837a4caf3f3be0d18f3 -Output = 4d21a2a9d7a309b2fea96ae61086804c8e4de2d64426687e47873d150b2d5d4ec07297605c8c0fc8da4ed15bd260d192de5bf658de8710f5ab284b17bf41bfae - -OutputLen = 64 -Secret = 80d60f606828975f057f29b93576ff058d7dbc40 -Salt = 0745278700b9f1d3c061ec0395863790fd6b43631789cc6ce3c8af09b757f42ea4131a945b421f60c2ea2b90dabd8e0154c38a -Output = 22b09a25c8eff0a6a8150881851d4674b14b3546eeed2ce2755de523e678900ee47bac688e55078f624e2c60141ce62f32b2e717550acfb3787e9df5116032ee - -OutputLen = 64 -Secret = ca9ea18199c53a8947d39dc533f602fdba606d83 -Salt = 8bf937deac74f3c33e907ed6d495799b92a28a8fdfc2bc4dcb5349a143ae8dc7e0a3e874f88ee287cd954837a2fc9802226a8c -Output = b8d959548a7894a26cde1eb496869316f43f8f57f205c9839a8c6189a0b6c1755d9a4a7e3a4b0934c3b07f60cd4d1dc88dcc2a0fb846ae53a1d875f2ebba873b - -OutputLen = 64 -Secret = 2ddc1f6e29916ffe137c3b9209fad66576abe8b7 -Salt = adf9dc471caeb6589a9173bb95f15b87fb3d17f80b5a46a21ea6a924bdb4a99cd7da7f63d3085679c45935cdeffc21a4139ca3 -Output = 17569c21d0d2f235bd09beb47d4c0c166fd341a2b911431a79ca430828e2d853ea8ab69d9af88349aff348d6cbc4230c720e9b9e42c19ccdad96141191971098 - -OutputLen = 64 -Secret = 71f444d368200a30c795c6caae612004153916bd -Salt = a74a7df3c48ff310d7dfb18e9a15a1259c0cd806aa5368351311fce562ff1744051bc283b7291b8bba2161af30c7dad3e62f5e -Output = b807b30dbc4f7a68ffd32ccd6ac213d15269d67632e893f5b4baad6f7c081de1abb9b1e577896af47366254fa3d621e97dd1d679e59b64590b615e606c37e435 - -OutputLen = 64 -Secret = c3c3be537e8bb4ace3a2ddacfc945fd59fe5f281 -Salt = b7d6e7b9a97a343cb11eb211a781df9ba451af1998565c5bb508ed5d56ed772b282501eb4ea1631c8bf378dfd40d6f1905e7dd -Output = 8a624759d3559acc88972c4ef99d75fe2dd734719880ea79a44b68dcad0d2c4a872ee21261019cabf73c1dee9c5a236df3165de75b30c56dfb01822635979a1f - -OutputLen = 64 -Secret = a4f4878a529003c4f083ab4009a96d598bf27e36 -Salt = 87429bcd094bc3ce91ccd8cac35a19db7e33a2101bb022b1c5f954b102b64df4c3be4c85fe902900d03437118b8b5a758baea5 -Output = b8efa9ca9da234536a72b04f473483cf47064ef0409dc93e85694eeab79d733816f989d99e700c5194cdece17f9016b114836e18c365099d8fadea0e6d32aa2c - -OutputLen = 64 -Secret = d7514ba1de91665b3a0ad2e141ecf1aab0990386 -Salt = 4a5e9f009d448005cbeea3a0a185ee423324047bbef868a716373b2e69d4c3e0abe4219f889e558b214b1fbe7fe1025e70fc40 -Output = d7431f01341ff0f4945c7264207043ec9b0904d5521aaea8c1f348242ec6d5eb68c2008c94e30cc62f63c268ebd38ebc7c0a85f9269961e11719e9acf2d2d3bc - -OutputLen = 256 -Secret = cbeb4593428c31f1ab445462175bea9a582258cf -Salt = 8a1cff7f4596b2bfcdb27e09b76fc3dd7c8ab0aa98ba803645f70e58564a62b86943eab41f4c0d19d2fae1335904f0a5f0b218 -Output = 1276c3ca89f2236fc672d47eb31abed71339c2a1d292d55989d0d539b87ca9347031774b9289ddea0b0cf4e202dab863caafdf3cfc5a7a3d3faf25e9a31057fd4a3eece09a5b8252da5b5da2e99a08c25bd586ecea3c966b340ef9c29693ae4ba99af488ec0b0f95cae2a20598a8a9d1537e3a06e8212a5132163d56f20faca08150ce3b954be3bbb5ab213874c9ed4ad9d1a4822afc90311dd6e8a3bfa164ba93e05bc02aa48aeb24548450290e911eb5904dc73fed8194b5e40fd65157ea923b54aed59272c9c87c1f34db50c3578ac134a331cdc4bb83b77726973539523f098cd29c7bbd5f6b19c084a1c1fbf4b953baf62a2f577e0c05d82a00e0c59c09 - -OutputLen = 256 -Secret = 7341d8e7b4df01889de11fac7feb91c08b786180 -Salt = 0236cc3c3c25171de076ecfc3b29258ce4b6c9a8788ba7f54eae77ecb736919366e9ed10f3bfb0cbd065381a73fa27dc578535 -Output = 1c9b130017dd4f3a7d78533f92af9b810e209e23177db55d4310efe515be2e9533f8677ebe7810ea62c3c4f971b49cf71f46b7b83cf1ff9556f30e9746025bc981067a9856e793633781c7cdde9c1c68da17404d1f9c82a9c2f65598406cdd48399c47e1038761088a78e6e31524ac2cbb7884543e3373291eef5cda3ec24d5a62cc251f52a37297f8496488534bdc60d890fc3f9f1f4d224f6d54b58bfbc81bc9e6bb57368e92bc6127364e3fcbe1a2238105a40b553e697e6753524d9b660387dcaf23c68ba76dd274d1420d7b8ca5f8865023245a31f86b9b3caaba3df242fef961cdc6f2ca0f1fee4b8381c24fdf2354fab53761d70dd6fa7c4e52e59449 - -OutputLen = 256 -Secret = a4e2b8d5d2627e20f3cb473d68330bb7faa6e836 -Salt = 40d39b8d03571afed2517692543488e96638e319e483c5025b5f9ad5332c6d29f8d26713b8be4c92229b04d11919ec53e55084 -Output = ef148d08963828a8dad1cf2c46241f357ed7c502acd539bc9070d53c1e032f047ba9165e5ef9967f01040dbaad21c6cc67d32f8f65eacaf35dcd8813c2aeffd7e738af678c3f0b5e05971cfca5fe9f30869312417dfde872ce941b1d42429adeaf0ef3f32db05dfe6e2911a697731e53e06e1e9fa1d08db5359e66885ba8653a11af7fec56823515aa209cfe0bfcc48fde34d1e0cd7faed2f110b70eb7619ce31365f371477d61a0daf528a56e84f14b1cff9cc4427f214944abbaca2d2319c40b86f68b1c6604aefad276e0b99baff4cb06f83d3120a5d743d4ee5ecbfb4b5c60b47ef41b5914b17df0f775981aa72591ce96d6b7b6c21b91256ab25a99525e - -OutputLen = 256 -Secret = 770fafd90b4b7f208f2e494e76de5087b3d46a67 -Salt = dfafa9a1a26bd615130b2ededebd09b634fdbab80807b74cb4194a3fc1b57c9de5a36212590269b1e6008ca316bc05d94f6363 -Output = b4fc43fd6af43749426fe2005eb5e8613f8cb6b47ac6fbc9c60d52da21d16c7c636096c78ea26ca22c38aa80ecea05bb65c75774b312579dfdb6c71d170a6e12e566a15f1e046244d3cd688a7cd9f0b12335b1d780f25a26d1eedd9e2aa5ce1b6bdf268a121693b6ca8c61ed743a0d4d26f858122cdfc3a9b2c9fb93c320f5dd0a88601344865ead25c159c41bbdd8b5bfb97f2dd69460aa9da2c9ac588a1f758ddbeed87f9dc2ec4a5de0aaf11fbd5951e4f092a6236af4df2fef25bc73677728a014c2604f653c927714d28cb22b3229eb03c9e2e6a23d6e71d07464192538db0326dfd480609f1b236501e111537decbf8a3d4533ef0935500cf531efe09b - -OutputLen = 256 -Secret = b118cc245012dbd73d94dbcd72bd75e1d1c191e1 -Salt = 7ec645b1a51c0a4262514b2e30cd27be68cdf4f130a09fb54282fb64b437da976acb6a95414571628179985f1d331c71471df6 -Output = 1927cfaa8e1c61182141deb6243f0d714c5ccb249e19c3dc40172ffe50f9cb7622cb966e5efcd6173314d08539cb88739d362fbb24859e38aa39e9a50e7d89f865b36d042507eacc6e10da2eceda23815b307d7eaf6ee3ccf01be2867e6c45652339a1bf2f828cf40995cdef908beb1df8d3d08f9c53dcda87c95ac518426b3affbaa1bebfe8ffbfa7c2caab0e8282278cadf561abecd68ab02a6058dcb557828d238848b77783321f79d54d5e866d6e8fe6a2593d96d7305dfa0302cec0e5d568a1749f9ccc25768f600f3e2781f87f435c7deeb517f144e6199971085440f2d2e8cb15df58325c32eb72a61a3b86afb8fb7a3a4272070d08a559bf63fd64d4 - -OutputLen = 256 -Secret = 7623abb04521e1460193877f820ba67ba8adb523 -Salt = eacd139adf843af5bf28e555fcbed287a5dc15637d4b8be169b42f1a8bcead00fffd9af155af3d33333b9ef1ff2868898d5fa0 -Output = 4d354dee4418951193c44c8f0dcddc83ecd9b18f984edfd4fed48a8b612cddb8bf4201cdba94a538d46eed066cf43924407d84b2bf9cf1e306cf059b0f01042eb8b913d49226884dc2ebd52b943c54c09d7de0d5e617127a930311e00b57511b1b0ccb808e9d1af0c5888050ad8d384d4c9804e0e9324ff5cae0a5d65e751608675e7d6fbeb8bf88ce69a0d400fe6d6f06981fa895158e3a8d3fbc9e8e1797a3bfb5c0843ecf578958271da818bd9c537cd3279c26b30fabff8a1b77b4776ccf47a4c874fb6f35dc90c9521b42de33102eddccf6d9e63c3f0bd76aee4fd4665bdd1e06462486b4337130938f2abadc59f91b2509f221db02fb243dd89a7fd33e - -OutputLen = 256 -Secret = 3049aea9031faa7e16f16c40640bcf7b65911cfb -Salt = ee08578d6e91922a31234c434ace79a90d4bc3c2fb3458fbc88acaa0c7ad2702ca9e8d8226b50a667765076c17420ff0944e58 -Output = f325a4a37ec8c7226bc6fed04b4f9e39cd2c8dbe080e3f6461680ef500c4e2e2da84cb793fdbd59da3462ffb74c36ce0ad6e72c13506701a3d85feb1e9ff2ae9aacbd1e96fe68df5fd5180ec405bd596e1284857868cbfb16151625f6f4a3e56a6366f9d667421cf27e4f316f7e7ed7855aff3dc2081958874c62e1b902cb453b2f5b74d4d4a4ce7653d365fad19484b1f09a28a4f34dd2c267ebb27815efd2e2c7bb618ee93cd000bfe1ab1ac5ac5a23e6173e0fa55e9390dfae89723eb58212ff48c4a95c68a303987b4f944dfbce85c2f318cf45b3094aa3d99c581920614eb38192fac3178cfe083ed775c70719929a6f3b6cee8fcefa36cf0fb50513160 - -OutputLen = 256 -Secret = 04fce3325ce4295ce3f78dc42ee64de278713420 -Salt = 4abcc94e4f365968cc56fb5187d23397d8eaf42e66003bf6fb8fb2c0f7663f8caa3eb28ea3ba6000ec7ae292528df54e472f9a -Output = fe2541f8620343e52f83dde513bc236e7c385c8287d85e62e347a3a3890fba09df6c6fcd57105e21fc63fb673fe91a89dd894ccf1fb04be7f464487945e3095082caa4e9405197eff6b18c0ea894d7c850aa424741cde188cf91819648e3e5eb11ae5a7b4ade98472c49af31b13e00d55028b4c7575078985cfc7ad1287ab0544413b5753af9d1770ddd4a27ac652ee2296486450267829e3b4f4ab936112b70e1a8bb44c10fa16ceac2a707869496eaf0c59e77fda339044fd5650f187e3d28e9f033c6ad364cb5485a47da3c42ed06bf508569871cf89938460101d2d4d19742929f9cdc673035a95ba29c4bc558ac8010b8f79d9e0202b5725969fc06ef43 - -OutputLen = 256 -Secret = eaf4e190ee6b71a4b520787e8aa066568a18e041 -Salt = f35201d3bbd9291f7e1ef0abb8edb45a36d956c02b8c4f4a89f3cc7a6dba9f092233e517d71e9161715eead37fa0f3b53807ba -Output = 38593650ad1e49f9e9357f2f21febee70010c5823bf4149c82e7f1136e21c49f48a8dcb096a159670c7a12e6d2fd34766c30b8f838f45ff54bee25b2ecb1a8b296a21455fc56bdf7c136bd58d7a3ab9debd322d7661ac712e0c6c2bfe62985bd88c194900b25f94c61ed6ef2f7d0743db50b0c256d2f98d5303f75636e10709b0a5c263e13e7fd7250d89ff54598220386e50c7c38fe8a293b80e254b0a3ecfa0a5e67bd7e204bb1c714ffa0aea859d66f6afbfb667ac3c14db2935b254b1300d1f39525632f90d5e588cad0659fd253e7c16048e645519d24cab436edf6047ca12045eddd528b1ac52e00873ada41be1b80c7af644b74dcb740fabfaec4743c - -OutputLen = 256 -Secret = 8ff127d12a048b1a28870e4a3805f7a0a773b946 -Salt = bd9ce1009b7ba2f4287e2cd7ca4489dafc72050bb8a68a01d6454884870d13cf12b712137e86d255126277d3c958fea756632e -Output = 96b5ac20d6d37f333a6b0b39b179bc44d8a1a616f986b367a0dad98154b4889b2d95ed1853b1d64dedee8a45cd32f6c87d2235dc781dc6d7e4fbe87a8e5acca8df7b1b05427d728059da48677d606cf339bd3636efbd55fd10a9dc92c15d7800db0183e8eee26bcf0f75c77b6df62a630b561d270afd32c51abab392656568f652e9694808555cb421761b132cafe0243332d99f896e450efc7997cda4eab6ada422e9fe6e64810dede443fdfa898164c511e4dafd9bd7134b52303f6bc5cf3f310a6d77b5c2f7a5ca757305876c46e9b7df74a7284305a281f02f671fd0098b4fe6b9afe09057fa97fc01a2aa7a300673ad37ac466e3c5f379b319a1c4e7739 - -OutputLen = 70 -Secret = a09ce704629a4c3fd271e67dfbde1ca8dabd7d7b -Salt = 0205a8444cb9499efc2f3d20c7d91a3ddc16b3b3113e2062f64b743c370140abc7d7b90f547c2be57e46450fad697223a6bb0c -Output = 71fb7aa3b28b779c76d8a3305bbc751c2135bc53284e6942429347cd51047f3d35ccdb9e6da77fdd3062c284d6c1a97cf1b32d70463e2b581ac792e7ae17841d99eca1587c9b - -OutputLen = 70 -Secret = 86ab7e06f7652b6c70ad3575a070ac77072212b2 -Salt = 3a2ac1b2870fee5d15b32d232acf3e5a7417fabf4c7474e05dc47401e2d01e6f58315e60ffd1a345c959f151ceb2ea90cf85b4 -Output = bcb32a6eef39dad886b063c0523cb21543a88a1e7f9119157d95ccc460f977763e19c47d14a93b6979b7f41e690a87a40278529a345fd72552ee2d4dd95b7639d68e80f063fb - -OutputLen = 70 -Secret = 2a20b3d22b42bc11a7aeaf3122c6444db2a2e4ca -Salt = c77f8a2dc60ac37dd007258df908c0cbabd33743213c8e965f6a6badb34c05f5744a07f035a88b1af269111d6e49e7a57ad823 -Output = a5a068d5ec41f0982fcd6de4ea1afc83ce4a032317a86e44025bb7ae7cbb960bbb50d0c5548eb96aa50f35ddf71cb2d5485a8480b639158d3e2c2b7f82142e62cff58b8490af - -OutputLen = 70 -Secret = 926f764ca8a623505da44a1e1dd2faf4ad103cd5 -Salt = f2a64c1e528afb9d1a51b3c09cae2e4ca5fc0f90dde811b4f004efe5695d55deb02214d60087a0e1ecb2dc01868068a40893c4 -Output = 5e44936620f4d6c3b036eea9f3d77bfe106b0c24ca365e1dacf206df83a0c87a6977a36727bc232787029a46d4ef49280868dcb9ab3c0c4fb59c68ef5c5a3df2eb333b60009b - -OutputLen = 70 -Secret = 6e4b7fdd1b7914e32a9c40ca164881c8a755c6b7 -Salt = 864de7005cba1384d6d19267583b454f9fd44a1cf0ac46c9ac940572c63a4cd78ebc0c6cc08e91f652196e6509aea63bc27d69 -Output = 8efd42cd1b8f9bdf9303fa6befd936da9c5216fdab94c0550706d4bce6686b17eda78418adf585ec6ee0e38787b6a26e4a35f9b0effb19462fe1615864d31c19acd2020c951e - -OutputLen = 70 -Secret = 75f287b5ee7c66600432ee562c62a3d5c629786f -Salt = 73a5cbfcba3926d70780dd5d26e885307641a20fe21c3704f90c3aa5b909d8fb3e559b5df9e843b3a4b184236575450070a076 -Output = 73b2d3bc84f052c42eae617e8d231b249160ac27ea70bdfe9f31a5cec81874bbdb32e05b14edc0f5b559f10a825d849bcd9d3ade5e13494955f99dbf2b25ade57a5cb792a5a4 - -OutputLen = 70 -Secret = aa28d4569c6f4060a97191f57738f205993288e8 -Salt = cbe85313bc53ec7114d04ee13bdd7a63ce4e5fda2aa35aef55d629f2f6da26dc10b5dbcbf6dda1f1a25784edaa8b514777a9ae -Output = 41d2e39ca54829dbb9eba1a80b33cf83b1f0f6fb8b46844dadbb49cf9126d4b0dbcb7ae116733a17461fd9797ce3c3ba9606002d1a2f1a274a55106d6b71fa8baf2515b0d6c4 - -OutputLen = 70 -Secret = c8da7843e49f6d8ee060b654da5f8b56cf395cb3 -Salt = f1f6e5fb87ae90723021d4c4cd4f562d6be2ea1bfec1b21d4823b1313a204c5ba1699ee9378bc90380b71b3010cbd737b9ebae -Output = 3c871a4586b3053f844b84ea810c515f741c23e8bb6a112da2e5e3e707c81aaef094131684345625778bb68b0c66f3c749dea30174e16aa69bbd23a5e3d71a13aa685b973b5c - -OutputLen = 70 -Secret = 3645ea044db14404c79a490bd95e7f05f223f0e8 -Salt = 8785c9786aa823a1b62f68a85721a1eb5c33c1784ef5a445d1c4939834e4ac31dde366e6b080fe13f4e51350d71ebfdfd8ff82 -Output = 63c5385e61ffa856d971c66d8963e2e7bebe9cda6c2ea7f24f28d897d24078d62145308dbc135baea4f9b37f172d7d43f71633d163bf2d0b1feb047b23e5df484a99789a6a11 - -OutputLen = 70 -Secret = 54bbf80231990c3bf0bda3f178a4eba29ce22c74 -Salt = 2a85e22c132dcd935b7d4770af5d450e38c9221ed63c06663e0c65410ccc9a23313816278ca5623fb45c653917f8e0036efbc7 -Output = eb047123697002fa7024f5dfbf533afdffa2f9bd7ab4f4e4e979688e96057650f104c21f99a08660bc2eee956dd31ad5d6d77a6ba5f3c6547b3d21dc20f4c62c9ad85b82de9e - -OutputLen = 200 -Secret = 93cc2eb71b7c87a71d6d93da190ba5faa0ac3d42 -Salt = 34621acf4a1c4c9aeec56915739e328f52e7983a1abe749b5ebda4e893bab36327306aa8846026108d2015a6ee60485a4fe63f -Output = 6350a561cd98e5af0cd99aa993911dd8512bd5b1a4e168a8ca65f520dc9280d2a8a209e6dfcbf1561a4729ab4d903ba8dea661dc1a661ba1dadd66c9d5f04122ef40b8cc2a40f8d41e5a5044ec30ab0b9ceabc40af61ab99d41a361368187a15a8b642349408ecdd4223851493c5d54b7fc6003fb8f0adfb1a07be1f0f08f0fe5e483d131e7f049de9accdf70fb016d5bfb314fb62b85da0cbd6e737bffce8b19c6c0e94fd5e4f1d00105f8b18c12ca231a858dd98123554d03d435e9798ddbf560bb60985321e28 - -OutputLen = 200 -Secret = 3120d38982ed483c6a43a3cce27c04906dd9b82d -Salt = 5d853a7a4eb5790b89c33faa79a38d2e01d2a63d7d460028dc23a75175be580c8fa38096b83d15df33e0f5a326c1cb95f36e2b -Output = ab11d29c6bd5d0a9ac14d7e531bd9bc46772cb80b487c320c85289c0791cd6413a5d247706107a47704fc8f1781a0999d914238b2b46cdc8fed29877f76bcf85b975f0f4738a12d6dd4102a621d2f5f2e5ff197ce9dd44cdb03fa13a98039df12db7dbb3200d116810287df8e767565e0ba8aaa9ea1590ce40936f5fb4695e6e2daa2086da9d8c50d1e4ba2eef3b77b3835aa20b76ce3b7dbc04f95f3860d4fdcf671cf670c79b6d8848a549ebc7d9a3eea63f9375e3d22d8817dedc92628b153fc1373934909e78 - -OutputLen = 200 -Secret = b5753c3e735676f12978baa02a6bddd07139ed69 -Salt = 71c0f80c1311cacb90c01c9b20b621de39f6627dcb4f5a478b54945e7bbca887e256ca98cbdea38f18bfc04f6d1ea7efa86a5d -Output = eedd48b1416085dba261341adc39ed9bc847bc996c9afbe9815b8c16adabe7bd4e78e6554e7714ae0059fd191a0e6014498b15ae1828314883b38ee7f6283c203af510a566bfdd741dabd1edaff6d6b91dc89fd996e2d613e73caec569bbdb8566a31557d86162b29eab6586bcd737e54cdbe3215540c68428c3886f118209cafaeaf6a86f4de8b93b179c483246004555bc5efc7d83dc33f388ad62a569af3d6036462af561b7273b77a697d2fa93f3b45b9493781ed4235867ff0fa589c30f5e0cd639b4939282 - -OutputLen = 200 -Secret = ae4a0c64caa163c57b0b79f93dcb94b9a2efbb1d -Salt = 2c5f3fbd454cf08ad1a24043787a8c46fe64b625a7a20efa06fbef94af245e522748cfb9ec319019366d7101bd5bab7e6e78b0 -Output = 1ae15469cac656ba101ef008f63f7a516935ccb899997aa65153944680d648773d82f31f0d64903b5375ea83478ccb8acd9422afa1425058e8b04f48d58e3275b429b0c20ff953772a13fbde87044066e9e7b0feb731879f80dd054eb55d95bf566210810a921a7d36c3f57797d897b8b5020a1da884139b683744f0af80c411abc3376964f1b0d0e252e293724794918b5fb69f4ee9b3dec1e279d4e7101744f4771f32f3bae8ccae25cda02f1b853a1e0435b99507ae433f6658468df8c77096f8000444adc486 - -OutputLen = 200 -Secret = ef290d2cce142d6862819e03ced69bca61c55718 -Salt = 061fd2f3f28b270f76a9ffcc775978dcc79659a6e07578bea2c8fa8e9ee81891ed14ed5a594734e12b7df67bfca689b5cb7e1f -Output = 8b7747b004122d1e4fac995bfe3f4ddfe967a57602e920677c4fd196073704934ec9caa2eb31299c63af7306a349f4e5a73dc34b9df0ed0405e4bef56e6434c7414eee08f80b38bb4651efd65d5990704d928073d2730a65c4a29002cafe25eb47df64adf8d494ab31d1bd38fff8e93de527844c645359a316358141462b8c1103a02144dc7e0bd9dd123a241164afbe8697dc15a571ee800d57dcc1aaf0963389c812d63092d10b10cc0698a650cdbe63967973a223c4ab98ece5c551c56d4f208ea32b83364d57 - -OutputLen = 200 -Secret = 51c18133b93aafc59a2c0243498f69435921036f -Salt = d642d41c9be390ccccec855fc47da6688258b842eba54935818c3e3771001cdde2cb2b8ccb02e047f471054ab598bd563bb72b -Output = 9a4fa891d1fc52b693a3d5a28ec7711459bc4cff0643edb88c88bff655473301b6bde82f7ee69f4d921fc6a175b7bd7b246c7f7afdb346bf014df13425476c9e410adea76069b28f14707145ca8579dd2f93526577808fbf72bb3c22270adba25f4e53ff585f7755db210a4e423345bb7f2327ac759dac1ac21d6de193024d7dcf08b938a29264b9f20a5eb5cd0d3ee7c727deaa6b4951ae24a7b2265eab4bb4e89db1e5126be7ce4a6bf91c316e07b50ab24b428a86fd3191e677a8a167b562410e544d964bc1f4 - -OutputLen = 200 -Secret = a2237bd140a530e8c0e3471f1f330a45754a1fce -Salt = 842b2e23bce2e438e5a150a537934ecd3ec2cfa433a879adf5017d3919e53300c37d2e51874129e6894305aec68430292e143d -Output = eea56dde3356160e8ff0b1631eb9c9ae025703962927aac015ac6962dc8961aea3e8c06fbc38aea4cf341d43f699eac7518bfde918f13c0bd43672d3ee616dd92bac1aac55858d1a1ee0c9c1a9adb5396a49f9672ce053bf9d46f00d948f07f8829312d173e3f203dbb7580c2ed0ae642e00382f709257619871e156ad114eab550d30fad26af5b2be61c268de10db8cb108ae9001d4c13be7b35af61633b5948b68ad4539c42b550bf5280814319943d4ce2641a17fa3fdb5cbfac8bf8d314e20fa6cb7d62b3b22 - -OutputLen = 200 -Secret = d3f1beb242724e74e815f4b46c7dfb19dccfd91f -Salt = d24c0bbc8926e8eaaa615558ad6e255b6f275b8074a0ae6dd4b5a76d7617c5d7bccbdd518f7d61bccdf6ca92dd85eecf2a6a52 -Output = e16699080f184133fadfe43e5e093605a910eceda780db9a2637e88e03d321ef448641235b421115d5b0b4db3417f4573bead398d6c5bd43d4dbee2e5e7e99d4751d7409196a0fcabfa4c852fa0ea77b4ffbe1c12364461c119b0497fb71593feda7d04f3c6e33afbe0dc7c2137813c8b8f7c8fd7be163851591dc2c0cb2430e1728c2a04cc47fa2989d0970c9e382caeb11725535b170c831c2171111d91b76bb14240244205a847562c35ea80c57db46eed21fc1d39463fbf2eb85626a1c3170969fd7a330bee2 - -OutputLen = 200 -Secret = 90f02879491666fd2f377a4622eba9655bf36c3d -Salt = ec3cd33b468ecb0711f03f10e7ca7b8d87b7fb802b0951f15bd5e687dcd355c0dd1f632a1833d7238fb30e805838c59151c688 -Output = 2d216dc5dfe5bcd6e79b843133e353b705e9796cb0fd31851243539ba6ab1ba764d757a75bf66d6021c8db3fdf90a11bfd612b63e099a13a07982f9c1dccfe9df018e167cfdb37868c595322221c87388040cf85ad2dd87e28c20b94f3cb1c724cb9ae787e14f974bf57c41e907b49f85ab54c02fac9d62debf88a0c0e869aae8c2e45f35a7c7f7b739c71bb6e624b8f9be66854310601db85022ec831aa382b3a0108cf921a9745de4f16bdea396a5b08d51deda9f541ccd46533a6dcad3b459618005dad397b85 - -OutputLen = 200 -Secret = d0a2569d0e022b39e9f578baa6941f22e43bb3c3 -Salt = 8c8de0a2758fcc76728074a6678d80ff98d554f561e951d52a71bb44ed45c134242a1baafd42162b4d3552275d68a04f5120bb -Output = 6a563f0f001df3d0471bc5182984ed3a677b26328eab9a5c00a551f8862bdfa499dc791a635382c4b0c0c30558ca6dc9ef22a2efdb12ab8a82f172af91d864946be9cc9cde1a8b5f71ebe5cd5b664c287e585cf230dc4842ea929f5331102b4e338febfbe4cff9a61d6b324ce22803b7fabb2d7edd892cfb4b11dd1b1842d3fe1b351e666d637699bded43ab7f4094075a1a1965318d4b5bfbd4f16a6e859ea768ad1567eabbe1111a0a94fda6fc84e5ce8c0cd2234e025a2b2b4271a9d1f2a90e1efb9d033606b1 - -[SP800-108-Pipeline(SHA-224)] -OutputLen = 64 -Secret = 18b522deb2f3dafcd52c359162f694b4df3ed5a0f14fb377e9ff637c -Salt = fe3502480e4f181873878c08be4a8752de3ed610eed1cfece99d3a5a56b563c216fc10296c4cb532c0842144da4fc65edd9970 -Output = 651465a61c54964496fb7d50edf6ba5613befede96901c9cdec49d0e0c01f698fb5bc5d33be871eba0d4c710c4397ec8987f231f5146dbd2b324ffea163b98c8 - -OutputLen = 64 -Secret = 1247498353f15fe168ee5b20a4febe7a80fb4c17b6f689e22b2e70e1 -Salt = 5f940da949049381cbfbdc7ba4010bbf6ad575cdbc4dd331d2ad8917c67f227c9d2761d817900de04d5a684eb5be778bd9eafe -Output = f1fded0cb1dabf73cc5b3cbd4356984b49c176cb8acaa7e93dee24b604b5de3b4cef8b6dc7829b8fff7d7ae8a8086192d1ef54c93edc915efa9ff24f1bc4d10b - -OutputLen = 64 -Secret = d2e7a19b5b846b2985e191f50ec2807496a888dec323a96e3fb970b0 -Salt = e072b6af1940d5a198e81e8080c86dc66d3b5ce0fbf89dc0022cab4eaee26e927194ee273b93de77ba97eb919e105dd0f164fb -Output = 28817d7d8e241c551496245f7f3102bee483cbc7879270f31afdb3e1924bc9e327a20433c49e65d41b87fd0fd0fbf25800c7ac294066dd7148f3251b82e34751 - -OutputLen = 64 -Secret = 62c3330193906a2b89154bb754434974c688fc47a6ed74c5429c9b06 -Salt = c7c6e17ddcb6c62f7c3b9c241373c2b1cd36d95cacec42aa6bc83cbabd5bfe41bfb2557dc20d11ea6498c9ceb4632952f30ba7 -Output = 686493a9c42e7d9f1b399c65b0f826a60d2e5ab2bb6a5d93279e6fa3d9b59cfdeadef8e63bb9a501765d607e6f9d56b3cd1cf90ceeded8338165e1eaba331739 - -OutputLen = 64 -Secret = fb46f3332a6c27dab0c9e6cf545f48c7c104a6ecaab5e1f57d148bd9 -Salt = a1a4723fe1120e657a4ba2d2e656ae831e671460f84b322143bfd9562d48b71ce4048a7fcc33861be8ab9b09259e325dd42165 -Output = 2834e16dd48ee5d58acfe5a065aa4d2a250d0266cb84481a8790056e3f14f211e952e5ea27044d09b6b0e98e2ab6b2a0c0f313859600251e6b638fa1b36e44fd - -OutputLen = 64 -Secret = 2afb1424979d9f0fced0f5fcd2fdd7a45c3a974c018abf1a687cdd9c -Salt = 03fd46bbcbebcc28a507ed73db1f6185ae78fcc246d827ec7bdab06fbb9d45e181fcc44821a7d34852a913a505c81c24f03d0b -Output = c9fdfef312a5011ff0f335c6048e8dc28846a26730ff8c341845090afcedc961b781c86042b6029fe8dc3bf985fa2e78484311a2cc0ed8cbd7918e42c0ff006d - -OutputLen = 64 -Secret = ae027c27f8f574cc507b9bbfeaf5560f829c01a0196c2df561d9bc76 -Salt = d867a7890dc0286fb51a88d48b5414c07ce8b7b010de5c35ad764373d2bfef8f52d8593de33b7fde72f77633c6b9903e19b89d -Output = dda5493c85cf981df77316741b6b99646626c1b2e88d3ebb2017581074dfce125804775830a39c7a0155928e035891246f9d53b284591b7369312da15823dd83 - -OutputLen = 64 -Secret = 9b2ed0d7d468262fe1563b347af68549527e13812063348c30d0cb7d -Salt = 347ed8fc242fe80760efe58925cb3a8466abe2917f5cc1f4d337b6a43aa8a89398b1a0740ee6b5efb770a31311c34c15dfeff0 -Output = 3883857d8bb542e1e377d599c4063a88b051653b06d5c3c7284b14bd926470815a7a5df42c5569aea7d3c4a42e571e307e6296c4ff0230a677828763c7d8a709 - -OutputLen = 64 -Secret = f6917cddc456c3819e85970035f6421a1db84df48b304c4ac3d15392 -Salt = 16cd9b32e9c74c72cb178ee3835c9c3c949e9edaa1280aa1b3e96b5598cad6444168f1b3780998974a649636f4a77ac8e90383 -Output = 1310d37abeb9744a8a488f66cc2b952868b8dd58f0180ef4716a55ab91e61513eb7ccadda941fba731534aee0f1a3796822f980629a72ed56a555f0ceb10cab3 - -OutputLen = 64 -Secret = d7e32d72e300d6a0e3f92537eb5b9b252a9a22a7fe70eb7ec3a19190 -Salt = 1f22ee2d81e30b24f541b7532626b9c5914174c76111f64cd3878fc312f1d0231bbf5b8676260a95a761e6837eb0287057d393 -Output = f0a05454da48283bb93c566e1a0820ff2b7dfcd7bcd6825cc5e8f7aaf132b791e487756ba92afeba094e5b8382f72702342596f19ee735074aa09c0929945c19 - -OutputLen = 256 -Secret = 6a30903f4d1c5f0d236fa2f3d719b07e4846233c014776c9f136843a -Salt = 47d6c1e8c65ff7941ff9a4b9c422cc277b62c6df6278aaa677361f3557462794a1d99b29f15ea96232386db73a04267bb17938 -Output = 6844d3445762ad68764dfdab2120f854e27af5222e8e6ec3b5f8033de5a8f90b13d49d5ae1e9838c4a5cca07161f431b176f1e1d1503fe4c510b54f8bf2c5249772aa1ecfc3001cbe1fef744c8aad462d2bbe816edb12bb9c6e27a414690e34d99f9b3f806cd9958aeb8eb71850c3a7112a168316f6b3750c44c8ae1be3bde322ae6ec18e99b14840a071b14340733b0738dac9df0a52a2c04ca3ce75e7028da5cb71cc5e4ab01a519211e66fee9525bafbf05b8db2a0de6fbfefe9e20d3fe7165372f8fef814feec5d77fefb5bb1ca050643a3755c1fa9d77e38fc53b8032ae42475d1cc14bfeb44d67dc94e70106c780cad44bd81ecda314cdd3b3480ee312 - -OutputLen = 256 -Secret = cd3cf07462fbafaf3e6892018dfc61000664df26fa36e833e38b9924 -Salt = 4e1dc429f4e92fd55cd27c27cf6d99e51077b449804a2ba62527314f2181f388838370e397007f9d284c881585ca7fbeaf28df -Output = caba8676002eef7baf060d58a91df1845a999edfd1f2143e8bd0e28216da015020926868ac21b14a0410309f9f3221813237d0e2e90a91d9d07d89b08386156e628d062dea48a6f5d90a8e534339095f7033b7d08346d0b7f79265c709389287d9e31d2d9820a605908945f8c61515a90e7a217e8f6c83d4bcca981c476604551dd7bc6a4dd660c3a54e7d5393c260e062cb365280c430e83fa87568ef3d4dfc6e5dffc16a52e94b2adf3c3e13c6b1fe1575d19fc142ab8009916d91d32bf7b9eed1b370e29267735eea731ac3f5fd258c11279364aa5b4b1a96a0ce36cffc072393e2d1aa77c04b0cefd794c04670d7b1f9d28e5ed879c8f27b6f4398070c6b - -OutputLen = 256 -Secret = 08e173e924df812bd41323a420f3b5c5862d20ce729a521c2751e264 -Salt = bf70b7360c0838cf8bf3427c4cc94438122716fe76bfd0ca29f4d73639d4f500371b645daebb8e58b7753d7d45c17d6dc9f57d -Output = 75cfa4c837632468715e6e9a51b003d0083422c5866300b3d662ff8c650abd60774436e4540d9db32361e4ef2336fe15f9049314721453fe7e2af35fc515817652b4c8d21d2df21955b9707c98bd31d65d0c834a4bf252a6a070981642ac0d03bd38c96dc665a3412cb5ce9d4493faebf0d95d4d6298a95edc7ee61910d824141f2bd8cf1c2ea035d5a6846398e0b44edb03d94f586c901a2c57431f686d3512e833565ff802d71d2fef65de461cd6ebdbecc33529be2539e514f27d438c8536b14cf16ab4ebac532de3c5f855f5b2ec93d176296e4d2127ca8d31dbfc68a53fd30f86bc05de040124a1513c34eee76632d6f78271f51abff39fa057875e49a2 - -OutputLen = 256 -Secret = 01e9ca1a82cf7df9e0a8122cd3036b07ee3b91f6d351856066b0a665 -Salt = 38873a3660702344a072ff4f6338d852672aeee33538c6d8943cd5e9ab748a815f64681048a386c44f31df908749084a5aed54 -Output = 536ef00994acacc0feecf76092dbf3d8f0f5e7bb47b7aa5620a2126c70163ff90e07e626868ae2a36106bac0a733779d6864a7e4e2d6c8247c8cbcb7634b8f68fb5afb7088a1c18de6bc79fbd89ad09004f5782b7fa42e02f36649b21098401c228b93e5df4fe843676aa0b61ecb6817ad4d0c1b911545f84bcc4bd37c3926058744e8bc4f75739a15658b2d4a32629f577722534bf951826acbbddd39f898277c211b475656511837046dde0f8eaa2bc59830992f5b0b4824d7543f5dd8908fbe57691bb2bfbbd1647a2b86d4c2fdcf2b3f3fbc93cda7aad39f75a04565ea70c1b87d94c537d7769aa0ed27cf30e0a5cda02dd864c98ddf2f788524745c3785 - -OutputLen = 256 -Secret = c24ac955ecf91859d3b98a9f4bc02177806d86cbc4b78a06d611da9e -Salt = 967bb5cfcb449fa91948a00000654bdd5f08e41ce260b5e2be8520b87fe9711355b3569dee4630ed0ed94d20b4908eb2be66f5 -Output = ebb65e6302af45e610aa435386627ed869f8e740e0ff3c6fd9b520965fabc7fe376bc43da1c9726c0baba4859dc4ee6d4ba6857a523c95eceb70e9ac3d3447f5b36f98aa76d10beefbc0034a6c9cfc3bbab49a097a34cc7b3e31d29fbabd33a701c35e66b7ee2c4be1e156bd11399885c506f4a6bf1b50d92245e0b735a769d640b6fc956f836803a71dfd41a0c5ba2c54dc6b46edb60919de2b416329a0a6b7374ab9181f2be2bb9709fb33a6b736e3d18da2383dbf17c12d464c404ac3bbdba22b1ffdd4f7d87a03ce0880eca968008c018482b5eba722854957a4dd1e5b631d9220730184cc4d898fe1def87cec5dba12077c4adbcea2b33fa9e7ab933d33 - -OutputLen = 256 -Secret = 9108576f9c6ed6a70ef93fa7a0e88a0ad49f3145650a12968f2915ed -Salt = 3426af10ad65d5a3d23350177e9b1845efa600489fbb4e406f3103cec0ebb778665b075ed49a0ba796e8b1af8f5b7bc2fee85d -Output = 63d6983771900be07aaed258b9cbce97a552cd4753ced49f65d7b5faf4cb1f8853e7573d5e02bcf25bb04d2cfc6b07e8acc776f2b05d8e8afc10af2245f5076295b914cdf0da289154cb2ac4e0d1a423e5c1702ab4f065281c56f2d626d90452abcd93b339e367390492e6b719ec35d0662c6c0ad2a3277c9ac7ef887caf69a81894f776cfebbbbe8a0d68081322ad4e3789baf45a41e018aeed92393fd516215d8c7f9d2a40d1c214cf0d9721a127b856f03bceb07837a5ee075fa4a4147a09b7b8d900361bf34563f0aa6086afbd094e3127f7ebd3ba2de8d0dca951fc49ece69492ceeabaf4686adc69ef8aa463183f9cbc98fb8b9daeba3aafb0d3c01d0d - -OutputLen = 256 -Secret = e50907c136768cb430bc70bb417a53319ad8f44d9ece6c9b706984a7 -Salt = d3a4fadc357b14b1ca7ad0656f6000433153eee7c1231040bcfbf22b273e0553717eba1258e6197fea4e88f7f53a25fd2db24d -Output = 9353991ab48e9286c6133e59583722c7c80f6a13b6ec7472df8914aa1385bb6e0b4090c6287f25cb100ee90e4d412201de413528bc093ff35b606de59b923b89e38a47b890a0c69f7a42d620e2982447f3de1a3429c94af44b101e0bdebb99b542c3ca6b296297a856b05c8dbcb8c9008fdc5c7001715bbc81a5a5826f2cb9987363c6d02ba68d732a27a602967d6a7e993435f109da0817077138b1bf218d5763483b71cc971c487e12ebf720956947f2cf7f76b8819a6d458393963fa2e87ee7e1447858694287cdeba456ea2887c50d7bae245e3c7e1528712c8f2babb20b7dcadb053ec492a11e9905a8bd55a3d5e3f4a439e511356ca0926d1ac8062d53 - -OutputLen = 256 -Secret = e58bcecc92a643997958e14f92666cc57e16447ce532fe4f2abae6c1 -Salt = 4471fde229cb5a12dadc12fe41c40a7c9a948e8b06cc30c792e99a67867cc01a74a165e024deff29482ff19495a9eee58b738d -Output = 688f099736848b37762cc667f97336df31f5f0958a73fb6650be922cac23fd2de347ce065f79682c73ba018d3bd1ab12f57f6b764bc587a16090dd8ad854e7b814f78fb130849e193f27504539ade8aa0a229332973839c8d23a8245a200e0602853fe0e348cb3042bb434bd9174f8dfb6aaf5d711f2f8a9629ef8ad5754686b6d36f57df0e4d4129c4d71b27438a300d9fa8daa06c6ebd66828ef67336ff0f1bc1fa287be27ae6a9ffee0fb043f78e7b53d241b75e26263f040c2bccca8475eb7105bf1f4057ea236d54df4c3eee8798dca4179846a808bf3ec7c2392fa00c0a86bd2a610278459b01606ce462eccf502001cf8090601cf1fe7fa62fbbcaa4e - -OutputLen = 256 -Secret = 459bc1e79a11a59ad2add504336f92fbd9529d97a367006b559b59a6 -Salt = 4e412e4bb39c1071f32902f2a6595841e331e07fcf710da9b828ba27ec9196bce0fd3970435f94e8bd9717486ccd0f25bfbd21 -Output = be695d557d3ac9d2d54b5617335249760dbdfa505d064981a0fed097240ef68671dc93840ac3afac257c01f0610010c68a4dccc2e80b1a93d92f93bde7911f52a427a1bd0fb4c3ed886c3ea20698ad0a9b0b7e6c7f97bbdcc0aec8032988eb4ec2ddf872f522f2620eec1e8ee34dc60228514ff8390b60ee2b1524392fe89a36fe8fdbcd0c1705290ae0b15e71d671dbbf05ebe5712eb355932cc196d360aa3c37921ee120563d7c8460a2c6c28d9967bb9c2f69968069d54040b0d505a2e9c554a38ee7906420d9447a6a677c3f39cc2a8668e265bf0064121c9a8f583ebcb17462d3a05a5e570122987b4a26c6f49a693dd4eae63eed84adb20dadee3ec690 - -OutputLen = 256 -Secret = 5474da4be96cde74ab6d1fe063ed48106ae67b1466a7b9861fcd125c -Salt = b290b0a9881c2e441dd84c14c6caa483d95a2af1d37468694a735dce083e61b5614ab9181f291c997c4e8b6c681198fec29e2c -Output = d36549507c9528778a4746f1552e1e349d4cdcee459e5858948be202ff4b0c2014a127772af378359e790ec626df511cddc8a7043fe8f02eb10ce649eae43f39f9fdb96a64bc4e42d60aa18524e33e90d84a14d1f401cf477cf579dc8c391c101debf3d1424c27f6f3725ef0938cd5b440e69b7ccef60bbdf06f937d829b0d0fc9f3e48c254252c7d2cb598875c4e9ff6d38484c936862c8b4d1923429450a1327439fc183dd7482da0c2f2bc00a2d211286dbbd7ac02c840ebb97dc48832efc4e9d72179e8a79b601ae5bc64f15969c9096cd8396c264700c87138389fab565f47489554aa03d5efe5b7c96c9a812570d06bcb353841b1fd06837d6deebf70a - -OutputLen = 70 -Secret = 2b3776644234c9c16dc04bfc286659970ef3c12065f50248699f9834 -Salt = d667e47b180a671cb3582c3529bc2dd1d52f33e8118fbfe3e45e1efc26ee3e927b56aede653751ddf02bc759f131bcda3ef220 -Output = fca204f7bd840d1bd02a1255789d53c06066aceed711fb5e01a78cdf1971740ad229a55522912290c734c102380b2262f38cb1ebb4a49e815a42c284209237c8751ee1ee3ff9 - -OutputLen = 70 -Secret = 0f2e575b0e5c69d2709d35fed43baba9ef4f77c504ad4e040ae96d1e -Salt = 3a53a0eab56476b9c28d0d071eee288599bfdfa28039db919dbed758e29e5f8e8db8bcd664472249807a651c711a9b389167ba -Output = c87f95125e2fe5a9c643e912807d9dadc5d4379f614d255e32c81fd1d328b9ae116b303d8ac6206b487d641d76b967b391ed7675ec1caf643bb9f691ebdc52758e5ba8e76dd5 - -OutputLen = 70 -Secret = 5eb97f5f468cd17ea58b5333cda96506e71d34aca1416081f7255319 -Salt = b505ea2d2885db68a3cc9ae5519d8f1443245f4e60d6f42ac82f59c447ab0fcb59862b7c9448581c18af1ae865646054d5e680 -Output = 3326dda26df90baa133f660fcfca5d46a73142b48a8f53d71491a6c6c48425e2128ac9fb92c4d28b13075319fe557233bf60db4dfd2b737780ed72b185ed39d7fdbfe6a6bd46 - -OutputLen = 70 -Secret = bbecdcd3ea84c48df3e2dcb98c944bb17ae1ac4b1977c09c8f0072b0 -Salt = aac38c5fe15e1306e287c4cb9384df8d07748cd64cb6726714af909bf994dacde5d3a66adbe946458c7a16177cc1d84671d2b0 -Output = 13c484c3da86c536976818316dd12a3a937c8b3d6c880f59f92432517d1570002a2387ddcb8210d5913ce9d022aa3a2340e06e8eddebd28a3fcadae77e3e5b623f68d80ca6c7 - -OutputLen = 70 -Secret = 79709224a39a825c28a88174908755757dd6fced06ed619b41feb41c -Salt = 4f6a812026b2f2fdd2f3f27ce9bc0e6fe54c5d4593f6ef8dfb6d0ca4702bd5edbc47154cf9738b0ac0135565285ae258363b05 -Output = 2d81235265626169055f8bde9800b28a56f5f60651087e5c4f321f2715e2c595fd383cf51dfc052bbd8079bf359e5b3774f84bd054e8d2ac1dddcca384be4f72106e0618a65d - -OutputLen = 70 -Secret = 3304b83379379634a4dd143a2e6c788d51fccff9dc6ad1d5a9265011 -Salt = cf2dc868ec617b04bb74aaa4dcf3e7902b4c5c44c27936923c27a8f176a6832edd5f39e23618a6161ed79b0cc8ba9b7932d093 -Output = 0eb85159a34c5e9e0f11a733aa105e918a56c4daa27d0f53dfdc17814008d4c0d84438d9d38bc29de1bad0639b8a6c7328fb1661a748c0a327752bd1fbea488d90fdf5dd5065 - -OutputLen = 70 -Secret = f81d12b65aef2fa9478164bb39235dcb73117669eb24b8dede1b209d -Salt = 3dc94cbfc8ab4b37e0ad42b7be2837beb2d56f8e149dde0292e1dda71f4a847c9334566c6f073d65178824f207aaecbc1411ea -Output = 0fd8c7627812259f23e7f79004b0333be88fad3974b8cc7a94b8636f2bbc903ff67ee547fe2732ae4ba5bfd72349796761c39aa9933fb4a721b5db33d553416ad29e1269f72e - -OutputLen = 70 -Secret = e9c3cff5e144aa5afbd72333caa4e9ec39ff13867f3ce85bcb88a5b6 -Salt = 217b0075bf23de39eafd2b6851aeacb1ff202190dd257ba7f3daf40ed1221b6c191a3c2257d17be9ac315e14d599f9a3f7fa11 -Output = 5d50f6115276b3ae0b9a171cc1f4957e6761d7e6b8bd566893f259b13581f539c22449c238fd944920c8332158132d51a44030f4d7a700e3a87dcf9988a5cc6ba73f4e90cf79 - -OutputLen = 70 -Secret = 8c44cfedec5070e612e01dc15019aa768479fc6ed3ad38184866d963 -Salt = dfed7f64f3652efe725ba67e1935dd30515a156bd8f466abdd403b40753c0575014ab40e31aa49b8a7b66c22b3bb4a842d403b -Output = 4af5633ae0be44e2115c39ddfffff22d75d781a21b5b1f180e217526f403c03df8519e026857be37992e589b970a00dc4bae4b3f3534d0ad1ccde82b031fb40cdf5e317d4ec9 - -OutputLen = 70 -Secret = 97de5b5491c244155a5be4136591c102dd96be4c0b8c7e9217d22477 -Salt = c13d08ac9e0295ff54e24622a9fbf14bf757f2795767b8bc6380ad8ce6202d56ff3798667d4dc55d70c63883da8f224a9c14ff -Output = 39d68dffebbed64b574b3170cdcd3cef0b4d2784fc0885978be9f30b483ed247bb0bc63b61e4930b6b2bf932a48def7da7f6590c788b14acf7e985be1fa78e2b80de1f0711fd - -OutputLen = 200 -Secret = af06255ef2e3d45eae778ec22036b8b0cd0ac03c6ffb43a53f2dd215 -Salt = 1380112cad43c077534e97cc50f3386eb5ecd72823efd1ed3e88d40882ad321f51c28a0d162ee67a4f4669be09611c3197ad3b -Output = f701cd51e5f1d1728cec7e732a37a256f2df670c03b655528da28cc1a21234fb660ba94c9f6f8601f8ef3fc95219b0d3d57b047016511b95eae157c3a5e3547d6be67289e95f3fba30afd5a796ca285d8fa1856540351ff26f8130778e91c46c652e957c6212a77a5fad4ce44e3eebf1b19b8d5da336771ba2e013eb0beda50f7901a81808fef1ac3f42c1bd43d6355854f51efdce7f3151f3fdd119799e99d3b0ff5952bfe6a2f75866d643c6ef64e641c62dbd020298c4ac53afd1258aec71fcd945fd282ad1cb - -OutputLen = 200 -Secret = 8d563e1fa58fdd6126adda5d79f5f8b221c122b4514bf018793769e5 -Salt = 58f3954f50a1095d2e7c855bb67ec201fbceae8d7fa3f02a1deaced1f2e85e4bff4cd70785142eda597199f4b0a8308b11d563 -Output = 42bb7855909bc1355f5c3bcf1648ffba682f208dbc3b9e6a15cec61e6ff2ef6b8df89cab1d1af33b1c32e20983db18356f9af0fa6a915208f288340392f13ed7681472b1c5422e5e797e114e4c6f1ac69898b0031e2eb5b9fab03bc558c9bb6d28348ef182a548e0b75071689005e482c065a9881b7514df787fe2708b93565ab857bc97ac45862e779ed595c11e8fc547ef040af59cf7d6fde25393594593c9533cde7b84dec8b7dc5751d39404bf55d3b5a17a346ee6844fd5b6f4d20ac973529794b207fbe479 - -OutputLen = 200 -Secret = 911345c6eef42ff7acccdd77ef71aa692a7e28bae7a79008c8c921be -Salt = fc2ff71893a3ced522d26eefad47f6ca1af1bb8457230935ebe021e1fd07a38d5980176af6a98b980f5bb0c5cc307d5e4d3219 -Output = 4c7083a0d928655799b0036a8053b552dfda4a67249fb0679739822a2ddca3ab8e619bf9c64066f6a33f3a23436962913e405c9ff95260bf9dd2e8788611207a39574f029bf8355a487d8eeae0a4aedeff8a180f97deac9900dea905ba07382ceabd0aad8c064d662966ff75269595cc7c56260ab3a2c3adc79179c231a76c5a493c8754b7dee67ad1cd4703502c34ab373e069fcd2272c42498a949f5db92024e3045112149c16c834b145f9973260cc5b49b1fdf6fd29b454b19abfeb2935d553ad349dce078d9 - -OutputLen = 200 -Secret = ef2e8b099f0e00d75b8aeb562d96f3845b78fc9300bdeee9a64fc65e -Salt = dfc8053ea589c7337e7cdbf342c0b9d3c279e9d38ba6e56edfe6de5b8be930d79d1bdcc60b6f88fa715065dcb0e01a1973c6f4 -Output = cdba06300882a00ee2ee14d46cb27ccacba39f001ad332f287c8e186e1a481a17db65e9d7971eafa987c906a93f6d1769054626e888eb8a58e26117db60423a117b8c3097fb76b2315da0f81ab988a2ad543a85a149927b0273d645bf0ef3200cb49aae65385c48102eb821f6ee8aba6800cd081e3fe2efb0e135b9097b5eb4288738817ff9ac4400c1c8efe5981dbae229ac4d6732110bf273faaaf320a894cc5c1729dce2e1e3470452cc8256979be8d56c3476e2ff5e5cafea55626cc4b6dd03380e00dec705f - -OutputLen = 200 -Secret = 67a0b0460fac8a7a901b082a4522797591cdea3161feb07f4f9af5d7 -Salt = 768bd7703a8a2f7d3fdfc9cef2216647d01515551c1208d486dd93783eba64e7e40a10f76b451f9a754abe04f1ef702d65a06b -Output = c4cf7f86e1c26d0315eb55f28ebad7b67c045d6365dce3e1aea051fe014153e3206598a34954ee75425fbaaf5eab8499aaf733691752c1bc11c6d96ce9729c36558f67b0a67c4ba40bf7e13d45b3bbcf535df544583c7a58388d3bf8a6be562e82d0fe88696c373511101e56068a247deccffed56605730147448f1bda049983aa18e14b38b7feaf66c769f123dd77970cabc2dfaa332cee99ee90191e515f06c17c962cf3871382243d97dc590e3706eb287cff8e0e05fa19f3fcecf2d1df5b1c9602f1b4dc5c95 - -OutputLen = 200 -Secret = a681c726a590a59b237c3ae0b766a856eec40cbdfad6465b6b875659 -Salt = 3e544aaba4186d97dff19c5355a39a03963e5eae4ed3888d5389c208c5eb3c8158e44cd326fca09bb71fa459d02cf36ac32642 -Output = 8da2604067f3df05807c3a9b761cdf2b20ffc8d6c2125fd056bef7fc4023b8aa5771eb3d99226348c58ef0feee247618e4357aaeabf00e1c8b6d1b89aa9d11fe67206f5f35d66461f4847e41720cadd21745b1bec882a7319251641765c7472acdb5091592dfce4a0239a09e2a3c6159e8c72d4a0bbf3d18c9dc60d0540244309e65934644d38fd717263afdc3a996fcd9f741fc05577407b43ee52e60ffbcafcff40c922603baf954cf3189dc0afd2713ad75afeefe147cf67a70abccabb50f5d0502a8866269f4 - -OutputLen = 200 -Secret = 6827b574defd2a29bd12ecf18ec194442aef643b5d0a2b92b968431a -Salt = d4c592d8307709b3ea42a0f61da9ff400f4ff86113573c3818b3311ddf990ee228eb57b682b08b8ab6188aa1cf032a9a27a16a -Output = a1beb438c6ab33ba20383f281f8b33b6d88af9961c9d407cd22ca642a9d367985b428e4e3154dcda307f3558d61b6dbcfdc9e7e2ba07d5c093fbc68ad7f262efa46f3b8fc49c80d0a2df347d02c4f6498964308449b19fedc0fddc6aaf2ed1e46d519aedea1359c59df8e4cce2699ab6e48984e78322c4ed52ffb351f988752f837579ff0029ebcf61b0294f29ff39b06a255403005c115bc604432b27da5face44609a1fdc07473971ab436ed57035aa1f8b4250da4c783c03b876ffcabe0b922f303c5b0f894d4 - -OutputLen = 200 -Secret = f2011237a298d8f43cab1a234402ee95988bee7c3251b5bef81ade10 -Salt = 0ce2a9d9410e0df775b9094738c589acbda4c7ad5b5a5a5eae98d8a19590f12ead530f28d964bacc1910d310980b419bfd9b1a -Output = 429f4c25dddc053813e4aa411cc1839987e0a5e3f88f93e1080edc6eb2000fc40c3e562cdfdf34fda408dc61e42c54108023c3bb9deba4384510ac4df13197f9b7d09a603e09694aaa6f1aed3178cb8fa5061ab2ea613efd9177aab5cc669cf5a2639272e718ad7d4876ee945ea19aa86a231bae78d16788be6a63c343aeabaf6d959e4da94c93ee6e969870a94de01700916884243e05d0a89f8b6745bfe50bfb8dd4a818edd95bb9df33127bb3a35e5cd2f1eed2b4e89bd9ac2eeedee86a5ed039d15971dd0773 - -OutputLen = 200 -Secret = 7a985c70bf964f35cc07cdde3c7b43a16599dc2ea7ce178e69ec7a2b -Salt = eb264ee92c352adee5dc2a2af0dfb09d8e995bea5b846983576273878bd1a438df277bcc4487dc780442928cb122ccd8d0b594 -Output = 548a09247838da0fdd5b2ed5470a61193914032f93d7446553cb9d24667fec0600f10e3dbb02718cbb922e22bda9c5b761b86e4ee3704e34f6d8d0bc1f8152ba0ebed6ba3bd88c7022885895a3b3492c645de435dd6540013e838d8ae1f911c3ba9767f2c93e37cda68350846e81b2846c310d1404a0abada962e9a00feb0952cdf3f5d27a84de450b3d13387a43046c46f00a6ad819e2fb1c5070323691c40e38ced6e0914f212a386c2e0553244bcdde68ba63768cb2925eb7f7df421f6c39abaabd93fe4ce8d9 - -OutputLen = 200 -Secret = 9564684c023caca03c79647410155a97d8f5dc8b3ed2e3d0776a06c3 -Salt = e6ec28bb6c955c6b7b7a0a98bc1d87283faba555ad3f52ec95fa78cf9efe54f4a47a991c928cbd9d7571f08e2e5d8cac96bb8d -Output = 80468db1f5724fc0aa589a782f22588d7805b92c73f39ff558ac15ea0ad4b9de6cb4a1e1c02f751dbeb674bb1b1bcd48c04da6d0f1d1f372643a5143656562ede38c39acb65289e47c027acbbafff5b01bcc41676504224637f09e6ed9738333fa700b0f7ed56c27c9fd73d5602fa6ea1f445547be1b36cf0abd2cf3df8beff4f5c1cf7c75f85fd171c9d3d8a710081cb7c4919768352fe6997a48ac07b0f22e8a9a6f5524ac319fab57b3b9a18a36b1cc2c8545f10c98ec3150176dc65a744400307f4b95e3234d -[SP800-108-Pipeline(SHA-256)] -OutputLen = 64 -Secret = 02d36fa021c20ddbdee469f0579468bae5cb13b548b6c61cdf9d3ec419111de2 -Salt = 85abe38bf265fbdc6445ae5c71159f1548c73b7d526a623104904a0f8792070b3df9902b9669490425a385eadb0f9c76e46f0f -Output = d69f74f518c9f64f90a0beebab69f689b73b5c13eb0f860a95cad7d9814f8c506eb7b179a5c5b4466a9ec154c3bf1c13efd6ec0d82b02c29af2c690299edc453 - -OutputLen = 64 -Secret = b4adbb961a0d765bdbaaaa4586c871e8f0978ced3b8d6c48262867cfbdc04626 -Salt = 2aa77754f050823fc2e461297e9dba7fbbd22fd29e68f64d9294ed7c179cd90fbc4adde850adebd024589dc50169b189cb4945 -Output = 942687bc9c76400553ec1fc602b4508e8f5cd276a1c56d98f039977daf1ab89a6f97435eb4bbb9115722a6ce3651c1c1d10faee2f9e50737ee1515f6e32b7cc6 - -OutputLen = 64 -Secret = a11b607978477268e2eaad4191d1308a9a5e571cb60522e60e705c9d92e5585b -Salt = ca7c31618b627f000bc66fdf0d380b3992d52bb2b3262a7fda8c35fba7a33b1086186e74b2fdb5c2c2a8f086aaaf718ffe3d3c -Output = e4573a9806b6588b0154ae7166ab620393808637c7b48990d42a4b44af4e6b13fd5be60f9c6b20e9c99e848291d2ac847fd24939d4431faf8129e7668a730a6d - -OutputLen = 64 -Secret = 546058fbcfb82d20964e52ff54b1a1d4c52e4ab48fd29ab51240fe0419fb6363 -Salt = e5d57ea82752648092f2aee9894b24ee48c74a1bf6ccbd4cd9e1b6020869159e552a947db280148cdf742da37950f02fb9b0c1 -Output = 56e29bce42800ab29fb0270e01f47747436263b0400e417ca08cf058b6ed3d4303f1d6732faaf27d78f7cb2372542a04ad3c25869a9e7a5572bd828f6e8f90d9 - -OutputLen = 64 -Secret = d74ecbedf3c8626a4769d7d6bf2e0d9f740d1a74a42bf56011baba00d7b25dd1 -Salt = dda0051d69769f1f04a1fe23ef574cb1199aa7e63dda467a488058bd7ff076be18568be349bb4850670f21e81820e14536a5a8 -Output = 9a0b92cd90038e720a8bd48d120bdf985415edb87557182643d017cb34801fab23aa840ab8e1174bfcdf1aa3cb83a7b879cc13ff87088859757163cb4d2a4772 - -OutputLen = 64 -Secret = 87b693799d867fdafc31661878fb6ac624a45dd8ecc2143485e2479119e251f4 -Salt = 9bd913f34b6f8cda194a3f53b32389d5365e2307b5d93617c9f88d70e3caeebdb6d52610e025b54e57916f7dac8be9b99f55e5 -Output = 56cca3ce656be3ff418c44759c931f5116bef9690314aaa384379b64d14fdec9d6f64d4317ff16c89da9f0ad1f580943c7ca43ad3a02263f9eff8a040c92e393 - -OutputLen = 64 -Secret = e18a8dc4f7b67cfd5e836e4a894caa08c1e006ff5655f3078b9ad50fd007b496 -Salt = 385663527d2254ce0e2a0839e254ef26470f46c89b7a21ec5d44775793c28c246a72c9cb756c6b8946b8a5cc5a7b0f9714088c -Output = 8ab7d1f7d13dd8e28793667272dcac79a9fb3f66b7296518ad9d4c5e35d1394aed11d1b4d2f9b70c8a6057eeb12fd42b9b2555b1a4de51012b33c2677340ea36 - -OutputLen = 64 -Secret = 094dc93bd1c757ca40cdfeb4853259c2b67cb3cc4401a4d24ea3bbe24bfe4db7 -Salt = fa47e85e067c53e805db920d0ae4de70003f8d6b026ce73b18db15c931bd48af8777fc7c5c1b689dbf2bfeb68616acd11db2d8 -Output = 6872efa44c9aff6f8324a0005664cb307dc32f8794fd4f62192693949714c06498567377598c4dc2acdaf47580a17582ea8a5f530e2754071f3cf8af2fe655ac - -OutputLen = 64 -Secret = 98c04cbcdbe50617ed69134847258f919074d0b494abcb2715dd3192580f6bbe -Salt = 0cc3795e66322645f1f13957fda39347ba19b7862f227d0a54fdcf7c954295c3565d148bebdf6e1b03f418eff96bfbdde81383 -Output = b8e7337be6da8ac1a5d4f5c11f4ccba0f0cd9f7a85e0de2301c3a67d3ea411ef124dab4d963bcf1840faa8c31ac913367ebbab99fa91db42834825a6dd5d0bf3 - -OutputLen = 64 -Secret = 242115b2ea49911552a11566d551fd9e93332e14cd7fce685a1d00f7feb759f9 -Salt = 949851d020683afedf86ea10483d0227aeca1919666f68e4b4f041f7b0a24eca126302fbe50c6cbe794b4615b44d100c7504b4 -Output = 832050d44a3f053a3de2c441a203081d4d547e6a1220bfc9df4a05cce93af294b54fd6f20a300164132413e0e653a32c492f78746ebf255ac57f1b7654205c4c - -OutputLen = 256 -Secret = 40da26dc85fc48a30a52fb7bc8d6db7dd18cb57eb0de5c9b210b5d574dde358b -Salt = a166a4e1b63f753ae8f6850c7cf96ff8e83b22eced5dd458af592bb26e3a1d51c85eefc39accd2805095d3288d4b0d0cb996a1 -Output = 4d515afd94a115e504ed265dbbe019f1405b4b7ab351e6d496b6b9c15ae7601905eaa123b80c9855fdd458f9871f7ec2d16e05bf8991f8165c9faf916d2c62bcfb34f0638a2f8c95a5b4b720123719988c5b6fd436858f3df65c4e22fec179cd065ea5cb8551c4582f65ff4f7eae9a3fda752ae862812016aa76343c5b6040d921f14f772d2fa9dba65094b244e770965629829dd14a9af537e80ca2122eb71e9b4b1c8e25dfe3b53155d969e596095675ca8dc67c12e11e7d950f219cad5e0bef3d6668becac52140b9c153897466331ddaedac6d0ae68672e99cae96f6a021686d4fc2f1c9febacf8bc9005e4afb9a5d24a15aa2d7afe1adcad43dc346b09d - -OutputLen = 256 -Secret = 6d98916c67a6b74f4da37116e1138d10216603150afb039879c2713214882202 -Salt = 350f604d67fe12ad07898a06f6b58eb26ba1be0dd8fdd4142fe48379f991e9935a75c6f6b0fa715e07da95f90a1b6f44e5ee69 -Output = 4b3c8714087a9a65f5274c402bb8d1e7c05ad05c6498631184280464b10edb12594c808068ae4e044eef3452c9f3f8e2cf9e0de9bb174ce22d6880c5e0d29dba780956f15276773e43c92ee2a05b860bdf522ac8ea24157a28a796da7d9438c6d0c02d52103f90cebe24188cada2fbb867282ebea7d47c04bc77cd0f022f424606d9bfc6acb78712b187a77a54f85317d7680ff360aff7481cfcf798a0b82ce31401851504cb52dd0409cccfcfe38d8f7d76a7401fcc07d87b26c2b967689695a31712d53b8fb285da0550e323a43785b2bf5fd816052accf514251b2e892cc2b21dd35fabe6ae0ec1bc4e465969a93619ba96975b71a806ab0d6267f9196765 - -OutputLen = 256 -Secret = c5e388cf257b8fd085cdbe3b61cd7498588d380f16552df6bbdea87f6f7e6ab9 -Salt = ae296f0693ee78ab7a0bc62b219548513ea883ca7a04540ec4e922f58ee9c9b5a6bad6547963020f2aec184de7eae9f516b413 -Output = 0754f8aee9d721c2a683392f2307582094c96c3c2de62d1b60c9bf26a84a30c771df614a62e9da9e2e1815a385ad7fe1f1c4de2bd21890fa5260a976debfe137470746f94622611618cdc5bb6cbdc625b22eba077b6cf24f5a07bf98a59a6c18a6d2ad64ff28af341225e24d4a6cc3097bc86bddc7c03b7903d21a12b30b506299cb4b781fc27d2d8548977dc3dd6025ea5a2c1b11b2380bb06a6f9de3e5c55a8b89e4d7aeb301b6f69ac0443994a0f1662e4c9b01a480be2f53aae0346254a8ff883180a45e8c4499840f8dd4a783ec6bd7bc60c40e02e20d7899a4fbc3d841c6ea1931b91c1c7ae47e9bd81c845977669a1878fa34a3d9e4909bcd30884d5e - -OutputLen = 256 -Secret = 8e0a9602fde11ac2665c768733c92c62e2ee0858c0fbe4c9b9e8afa589b1cc23 -Salt = 40379f5fff8950a7a00b52132469884a1584cc4e13aee05a28176b96f3de66fd2c401282e56ac5d048af4b8ac146033ee34c63 -Output = 93b689f75563fd18d1c2804d8ded8b2f76de38591790ba2b94840d98e11ad6a99555afa28a61b72d414cbb6b9e5082e23cccec60e15e15fa15f5b7c3c88ec18f42eb0c76726a2c9e27a2b1b78c388bbab4ea5a73faa6fd52f743d60505ddfd1f940e6866e06498a3cda968440e779e1ae39f3ad13bc0b742cbd84f31c6212e3ca6086145bdefa6bdb5c748da1d5e4098fa3234b7194df6d25a0172a8a01463fef86f614ca173da9327ceef785fd158c86d9724be07c7c50d7c0057f08d7ddc526dd62370521d92afceb393d39a88ff6f2bf52ee985e8a686947869cab0ef453a1062ce212ba765974b04a19ce6929fb2dcf6807805a75e3cc29ae3235768c9e4 - -OutputLen = 256 -Secret = 7dbce0c82d4b817654054ea26612f155aab592072658daf3cd19b5e75175cbef -Salt = 9c01f8660183d8cc4c20b0911a36e7b1c3613816aa4f0335509e5f013e7fd487d9d84fbb28b15f569a2f18c1dd5d2ac6b55a9e -Output = 9dfc307aef530caa81385a9b861c52aa13512b856c80304e1f168f2aa6fcfc575428e6f3e849b22a7fbf27902cc53d4b0507e1fb01ab7f5530d91208c061f9c329d7ab73ec53459741ed800cdc4ceb51b4c1059c7f54ffe92742b6e276bf9c65c28ec4488721b662a3956e98c576c96a6a0039b074b84aae616fe2d9de4ebfeaaaa418b753b06596de0d3ab3f83bc94f7be7fd998dab054d20de4ab1935ee0c86b3173ed88b26cf032bf1cecce87851e29200a2e03ee64f1bd9a752758144155aeb2770eca14f626fd06a6a1141ad0c853a943ed3339cc47ccec21e3872fb778c00d027e9ca800ae44a275118c4ec39231f8987b57db8a503d367bd2715ad464 - -OutputLen = 256 -Secret = e0e2d89832d997a9e1f0438581662a68bdce33db36c591ec4889accab27ecc12 -Salt = 244a37547da70912219ec70d274fb091c8ed9a2fbb99872b4528bdf71b6220a0f379d9c7f246238fbadf24c701c535dcaf0f3b -Output = 93684ff15eaae9df4fd25d71d7b00b2a42b757af93a19cfa291053f050a2d13f826b66c8d5a6072c4911f8cd53f8957274db47633158ffc17eabe541898f89cfa5d5a954003a2e594c1bdd9d58fd458a038d8d1e98fe36e3d7140911136c1e4827fef5d20ea04ffa46d5fbfd80197396d057e8a802c03ca44360328593bc06d27fa1a15a1464dfc222c2012718cc5d82328923f1c6250650def1b031116814e1e51289581f7819bbd06ed3eff6b2b997835cbe32de1018e5eacce63e0102d17bb1462a7cdc7d7b8b4b383ffa7d410f0b8990b5dcb892767f5190a18103f4c68f4795e70ea608f790f97f35f4ab50bf8922fa845aa5d92cb9f1817abc074aa10d - -OutputLen = 256 -Secret = 522e70047bac5903a0b7c78ec2bebdfe014f8c248dc7a800b0b18aaf7ee4f65f -Salt = 2ba41d842e30e7f351bec6f05522626cd3e2510707686e380760bf4594c115b20bb14a59178e8531d9de28cb76c564a7d17991 -Output = 408b2c132339e28af66759e200cfc8409b7c30b66997bc9bd91fb6a3bc1407b4ac554d9df62fb9ed9eb47e982b6c4a211af37f21373e254e66bf325fa6e9a5dcb0864216556a6399332b72a563f356f7ba8a15d5c25e575a608bc801ad23cdce900304f07c5efe683e2a3b03a3738b68be9ad2b2651eb575577dad36319ef95a83f47d4fe0e1fb96d55e43a6a66a62ceacb16bcb4407f2e68c9d2c5a11f5eb39e3851f601936ecec6d54fbd10e94e3f8b4f13f8d2109a8bb0106a7035e5ed01d02a3b0a0c7e0c15452965ddbced9364d1e81908cd828c44b240a97d3904f7a578ce8f590e075b3cb7eaa25acda9ee911b1f1bb1a44445cd2c5a1303091bf50b7 - -OutputLen = 256 -Secret = 15f640c518fd794f740f32bc1ecbb09969f67339652ff77e4476a600e90a7727 -Salt = 5e3aecf319a78c4c7463fd1dd2e0a34d0aae93d7a1edb9b994e43bac2afa55b0b7ddd64cbc15c3da10002df4774cefab231c0b -Output = f08d720109c1fcd4d4e43037a173f1938f6f49869602acc57e070f9eb68802b5edbf3d74e82cc2a4ebdfa42e7d382483ec74eb20d853d72de5e3bcc340069fc8516f5a4d61a5c7ad4b07a4b0fd263d22a520d0257a14f9b663e0909fcc6a00a3525fa839129b65c23ca0db036b332405494b9ac84a25fe34a083873ff818853a4292fb1a52bc49f64a68cb6d6557fbf3d590841d8c5b18fb8263901372f9a544f60b7eec8421d618e9690569aee962283734266cb915abc261b6328054cf17e6041491aa394bcbaab17756daaace458bbaacdedf887c2aa1c16000f0193c62df5fb94bfbbb0017d78efe13f7f5b8db1fb76ad699e839fd4647b8ebd5255c45bc - -OutputLen = 256 -Secret = ce380d19849d0483e397fdb4cb6572c561e0335d15ce96aa47d35d53ae99d2e6 -Salt = 3c378630f98335b3fdc5b4a63062771c8d91849da6853558d3d04420254e0e5eccacacdc8f1a77f68d51aa21ed3165427b0e82 -Output = 1564a226d0fb10954c9911079ba5eb7aad16c71cc0a854b21a69bbac3ffa4db1091ca73aa97ebee1c955ba6b83cdfdb20a5702d78d998ad6d52045509e4272782fd580f0ebde336c1559da0237e09bef35882d22be445ef837c1058d675a7a67067442eda133199259268aefdab2cdab6e1f7dd1f4efcd69b41f184739c8e6573fbbbf25d6275fe1f1ea66e32626842d3d0f77c03b71839e4d1ec3b28cbc56a4fce16ae1bc3ed881e050a01665733f7de5d2c539c3b19672cfb638cc236497c9c7ac79471b93a5833d9f6ff1d38ccd4f7d27d8e6863c0cb363eddaabbc357097c7e72125254d0aff0769a41396385e50ea2009aa592e1a3587ab4b4c4a6565d7 - -OutputLen = 256 -Secret = 27cf5630aea423ee44da1c3863c8391328437baf9e0a780062628f0dd3af7c51 -Salt = 7fac891c29fe21520002abc95e957f228509eabfeb26423f44d45488d9c210370872c0e998e0816521da1464aa68bc5d497b6c -Output = ebee20ebe4be982b109ca58ebf47ac0a8b372a3d56c2c425d303f088d609bac260ab1044317d3dae81c2814e95db96c38ac888e66e935f35fca4eb68c20797dd3f096afade871c85ef88bd8bcd74b7f614c2fe57150302a598b6e83d2a6d2c332973dd188d8467b1c985020125d2ecd336430f6e40c5a9934e86832d74a5b39768adbf5c4a2f1b6013484c57607d9d085c20acd14da28bd579bb221fb09b8b88ae5b901a86fabeacd227e5b57c2c274a4140cf0dfa5a3890c575b78a2a5d12f4652857c21d3f58f6290a866fabbcbe5ff95b4caf00cc82775cf64bb5623bf60961e7f0a0b94e7bf9387645161ab778935e31bafc94d3a9e13f5828eaa4c06bab - -OutputLen = 70 -Secret = 9306645e6b3182a66b1cca905480b7ffa8d60467a52c12202476a54287a45bc0 -Salt = 0fc1704af3daaa5942025495c22a710ed64bba03d71f0f89ee2b37552a073797d639a8fda73ee616332f5a54e51359ea578382 -Output = a0a718541e7722e8a62b7946ea0244d1b6f3f1dc9213a880cc1c777ead8814b51b687777258e32fe9f0e85854271d9cb029026c3c7eb920136005634b4e1c09acffa969cd952 - -OutputLen = 70 -Secret = 5109fda1ec058514b75bed881c5cbdec262116028c94c4904dcaf444f1db95bf -Salt = 452cf2aaa1ce31fe4cf72a26a7397a58b3164e60db7b63d78d12f08d99914f9a622e68e092f5e5fdcf15e1bf92b14b65f596b4 -Output = bca338bc0ad1569c0228b7edd3a16b5a893798a560ee92cace5808ee6e1214201c28b1319786c21a4bf912b77fd8559abff2c7d3018f63baf9aef5d50fb58a73cc644eed2857 - -OutputLen = 70 -Secret = 51e976bc33e740bd95e1885d57c3ce5ca8b7e7f1d2a8cc6ad43f4c737d52f454 -Salt = 8815227d1c296d63e6537734e38853c7a15edcdf53928d20245172d7579b8a578d4bb3fba3604f23fe1f67df2c716633143ba5 -Output = b5bd892c17029c5378317f4be9e6ada31a883fb40864c7530a702b4f47420b3ab97f74c7e847d35f3c5e626ebf74d841dc78cb7376b38b771aebd498c89171b4f0f9941f89e3 - -OutputLen = 70 -Secret = de11597fa2ddd3fa478b9d0dedf65a5179be332b1b1c193e55be260c4107a6eb -Salt = c37ff475aa0a93e962c534dad610ef19af63286f34ee926dbc36123cff3be72842da7e826003ccc67623d7fc7d954b4bd27057 -Output = f6fa056763132abebd8fc89eba0e70c9dd218b7cfc76731f92ad18f5f19c16ec341d5bd631acb2697bd11871cbfd323fb19ae25e3aa0de805a3e20f07dfa18a704fda0bb60de - -OutputLen = 70 -Secret = e73dc06b1d2cff52364585516168cf5095a8c8f24e9b633f18d7a127ff52c681 -Salt = f538c695b5dc3f80cbb672a8832a3874a2b673950a754ae881f8735475008d1dee5707c9f787c9ba65e3c4d6b6f0bc73904b10 -Output = cf870abb04824093d7e7c42d2846ce9ea156e460ba35c7e434c35b40453fc1ef2ef844af231f0fc42094ac191971be35431e417033470a589d831afa878d7f295b0e259b74bd - -OutputLen = 70 -Secret = a2271bf73ec5241000a16bf24d8a98510249278cc6d4234d3b62969e2d4c18f4 -Salt = 1fe1f8b01d8810f82ead673f40e96969423a9f148cd16f6c731a061730069583ee645356f0bb9760cee8219139e515fbef56b4 -Output = a08d9967662f89602f759f4f9caafbaf4fe5eaa8e0870e1e6c14f0bcea3248c6c7c63ea6b2f1f6b8b8ab4dbf6e2b5a59830c6fccefb177d1fd1474f9ac90feb9f9b49918288a - -OutputLen = 70 -Secret = f602e999d762efa6efddf9b6976733435df58bc165063f15529adb61dfc499d3 -Salt = c7a1d864ab703904fd1394ff5a8d998a3e0c1bd59c7a15352ed890c4cd362c3e532ea4ed40629d70c4a7e1ce16dc8430f9096a -Output = 1c0216765863b25c2ef8fbc85659ba72a5dc978ed3d03a7709e6622ef9be3f73c798bda143a0b82cea33e156122e1df60e6799f1f6f45d2b265bb0edbb975296ec465796ff46 - -OutputLen = 70 -Secret = 17e2fdda2d3d2edb2a1d7bc39957a082ee72eb694e452240c91468413eacc27a -Salt = a8ef1a71572f29ae90fa15927f2eedd05a4d206cc976951eac6cb0e3a210542e02ada3d5244c6759b7da10bb862ce18ea00cc2 -Output = 048cb2dad13654a16dcdbc9a4a585e4881d2f1247ce7d5ca2e889215de58637f95c0a12cd3673407376dcd32d5fa7bb5a1273623850217364cbcb005f00a55b6b1783157e328 - -OutputLen = 70 -Secret = 78b39659e3b72083eec9e42599d2de94652f7b264c01f4ec4cd1ed9b58a22bfb -Salt = 6c76558359b413fca461a8e42e6ea359b99911900f82c755e1311ad1ee2b3f34a69558574dc8057ede28fa537b17e018242149 -Output = c73321677b8a323ae897d6ebd0aec3d4a3dc0e0adf43e750a9db4aa7db1b9bd69abfd26c8632301511c1de0f9690a6c43f0ac86d43c9ced8a55fc19178792bb2e29dc6a0f863 - -OutputLen = 70 -Secret = b5ee35a7951621b1012f5e16cabe6c3c1228a62cdc81715eac14fffaacdbe5b5 -Salt = a5750a1eee752379cbdfbc9b7d7b74b508baa9166cbf9cc351a84f5d86c0466178da1aaa5e4f574421fb4f45a756a0ab1c990a -Output = ae3653fd9fc6c885fd1a03e939e9f860a2a96efe8920c80e208b4454a99fb5dec78b7ab37491f8d615f8aa22a8deebab47f51d73350e4e49f49a19de8e28ebd5907e144ac6f9 - -OutputLen = 200 -Secret = 5860b9f3bb3582c4bf22e3e4b5b467886b6de3561015ced09d9834f22e17674f -Salt = 3c30883bec925eb23586bdcec821d4ab7b72c42bb99e17d0d252784b3876786048bfb764be2111085578bd1b07402c0d83dfe9 -Output = 11f16cc9b141d54a5ea96909cc935b5d1fc2bb4a4fe909a32d085f27057c0bb40d0d6504f6040bb41086aae7c3f269cc3ce8a24027806aeb36d50873ed9b2a3fd93bc2d1a31e8f730d4672628214059bb3d6717ef2fe240129f0a87e7ecc3720b01463b344b8801022c3862f5c881480f54f52d7ec59800c70a968724d4afdc4d29fbfac1e1d111c58bbf92b707e3efcc9249f9e575640f5e0e257473f5fdaf789d2d46dcbf8bd5ea82b7c118e7b6e9c1226422cfda75b12778bd54cf46f42f05542cd93ad85be61 - -OutputLen = 200 -Secret = 52af6d83ffd6164d40ed68f3cb1549685ff7cc9a327fbab041214a8773e5df21 -Salt = d44b497826deb9a9a6cc0f09503d080977958be4e379b04938966ebd798ef47c816636ab17562fe0111ae5baefc006391da2da -Output = 49643a9610229bbaf2f2e3af545b2751670bd2a3878a3abb0e2e8db4bfb158545ca25d0614fd43d6e1b5aaaca329eb900943028797d763b94f3323f74163538e4a3f360ae7d95bd9ea22b7c9832eed23ced9429b9941417b61686c9a42bbfbcfe4183844b3793ed119e4df213af3199c1eac3fbe7151327b3e7a760769b7f10c02a6cf4414abc4a1fc18b9992bbb94106243bb872b5a2ce3163c300d14a5256d9350ba7ba9aa2decd0279627ff1057762d277aef7f61f782983fa8b6a52a4548f2f169eaacd60124 - -OutputLen = 200 -Secret = c71b8156c1e2059caf17abdfdc122fc0863c9b3b7bb6ab23a08d82eaf9bdad14 -Salt = 7c5f749a462df6e41c849e85a3e12564cff6437c72d24aedb670a8bf18afaedc71cdf00f6824f9cc5e55421a239af68bc993e3 -Output = 69bb7a6361c1bda671b89cb6e1e0123c80006b68684010787f7529e977054bf9271331a9608de786be12cff1c36da4fb0ad2574cdb6a07cb2ba69e7e50950dc06b59b341447479c90ed53c640112446368bb0f904463fa81a94ffe6444598691f27311d574bed7051e263ebede9665bc6ce86ec266bd47f7a436b0ff336d02573dc70ac8cf675b26b55d5147a437687cc899f7c73f496ee05ef9759441f8863bf87ff912c505757995818055473aa36774ea6c9a91ea736051e8451c08e3452431b7555c7dd684fd - -OutputLen = 200 -Secret = 543868ffdf3db371d9d7f7e419252342410658874de8dfa53268c84c358c5f0d -Salt = e634bcd826cfe16e780c09694d3f6366a19ba36758cfbd9a68e61588e46a282ae4e9ee1151a67efc4287bf29757571975822dc -Output = e44cd95665e46cae08f65ba934704c97e791dc39ba020062c6fe487dbb0c0823b039668627b3d3a1a5e8c9b78b74b5fbd5d3a13a64a370046e9fb41b7488b3e64ea08b009b328bd4541a6d9ff7528d64538549b4d4e454e0003a7eae1f33bba011e14de51ec1693b77f08dd9c7f278744d5acfda0241efd86729b372d61ca1f4786f1ed48fcf20198ca6157e8cb8169ffe9dac1a041a9430f01a7334dc9c92e7614f8d28cabdb114dcc803e8cac3768cf48b1181ddf7c06d06c6adf769e4483467cb8e0c1001d0db - -OutputLen = 200 -Secret = 4520b24c74bed499ef8591545c19f292bd5c8f2e5c41b4731d7135503a3bd0b0 -Salt = 4a033a2154359dbc520a000a7d805fa12f0138cf4920390146acef52890c3fd34394b14751df2b7e2308e5a4f651faf0edf180 -Output = 7567ffe7c3389c85c9568a18a5a355d1c6920ceba41fc4b751d83887fca7fc8dcd435b92cf02de5ea3aa398f28f992f4120f2831e2ff0cff569e01d87d36848c8ce981b3791768215bac86221bf15a29e02856d647f9929d92ac8eeb329e7b4039a625523ea8856f6088bc9f0ae603e90a12f1b431eb9603c4fd5918b4d7c24abb0842b7967bfd960010025468b9aab3731eb08653e6f0323d92405935972e76fdeadbf269df148436b2e16fe583069eb45dba51318bb81a6a71be9c8e070caa9875ebf663a11869 - -OutputLen = 200 -Secret = e3b8720b0f74d9b39a5849fafca63cffb009be79d977008137df269bb8415124 -Salt = d7b2ba93a72d19073a7d64b12e292af3791c1a00d619943273de84352956caa6f4310d95eb62140d0dc8cd6bd55c5be47cf4a4 -Output = 98da23a2b7a061899256f659854b0542bee2f5b69dd7ce7f81854fa8ca5a599429da55158054dd80f4970a9748bc7128fb145b7404b44d5002c822be328c02cff0582e99d6ad296c542c604569d912bb4781f3102e19f71971c7fedcecbb3a4cd2890a8a2870c524e62cf87481329353e97ffd8f67e3b46f5381f8eba8d90c859756625a8d387acfa2c72ee1651ba452e1fb71043812c684019ec1f516e5bd82a65599631db87c645ed9a44bd27c27138cf67a013517631d86479e56cad91403672d55b1eaff2c11 - -OutputLen = 200 -Secret = bc9c5aa1c8fab0708d0b10eef2a676a0c94a8fc44b673c127dd49e374b96df78 -Salt = db857f4be809860ff25b86b3099ad0bb034a5e6f042e05966a079633c90b95694947810811b3101a4284dc0bc55792fdd93ffc -Output = 9ecc6c0ede85999ea2c77d3158b6e207b5f0ab9a9e49652bc8d2b4781ef0afd7f39c6eba75db57908b10d818b3bb4f2688b00be696913a03d17b1ec61ac022cc5aaf35836eecbe58adf7e662749f087069c2e8335e99939e44fefce2e42718ede94a3c18797a0f2e94ff9d33ac27e416cc89a5454d06123c41d69e5201e45c7060b7bca89008277a3c756501af76f890180f87892f22f7f5ae1ac14c95b1e4eed47f6f21b41e8e606050c35ea5ac3873d05af4f227e76acdb4e1bced7662619c26082cec8e094386 - -OutputLen = 200 -Secret = 179d5a7810cf79058e011f3197f39155a75d72481fbdad6d1f93704ff3617054 -Salt = 84ccc58db86981fbda97a5bdc27da3dd09eb7873d5c039bd47c973126d95eee2ce956bc3e208ea6ca995a78a9deef53cd3ab71 -Output = a8f948a0c143c08488a8e7b65dadeca0d58e51021274ee1193aca599cfbd9fa64d5706bd9374aad969bee5039691a8a9850ec49ecea467cbed706d445440ba7bb396c7062ce3879eeb9813e14c4beca28bf60c31b19f7c3325c1e34307bf0e68dbbbb4ca137fd40eb14e023a51e60f51e25450afa9692aaaa761d9316329137669c8709a31d8e903f41552371dc4be2b28b9bed7ec791701c1b4b93f2a30151d81fd575accaa4c8e24ae8e80761e54bfb3b7df33580f50ae14c654ff37e64e901729c9421637555d - -OutputLen = 200 -Secret = f20c4f08a33dff02ea5c07e6649fb70246520a5d09bd8dccf4463800c2ce48da -Salt = 9e556723182e6780eb0847c8ccb0929183164398986eaaddb142f41f4fb478428965fccd51e2e6b4d0ba83731c6553cdcacf42 -Output = e276d8e478e81923a13f6c3a692b82b3a86caabf584551ea5a56e0a33ed64b4713a7c05c8b2c13de3466ff697232c0213304340610bdc51347fb0e7633f763cbd726cf24e0c83525faef86c496f28be782dbf6e9e70e2c73397df26d91dffc509779fecd7258a466330e7baeea97b87d06272bf239451c5d22c5afc0a603fa16def0547721a9ec278063b3173e4f32eb4524a28dbdbe951b93e52f72bd05544c34f42dc90bd63d3a9cff0e7720ac6f6b8353de5ed815ebca913e6e3d18c9501e0e8ee209283d49e8 - -OutputLen = 200 -Secret = 35a8ce80ec4cb63e07558bd891f7c8bc7993216f6949eedeb28baac0a44253e2 -Salt = d8fe7305bd5ebab2ca6f162980a2b278cf08c8beaecc1e48d33cd0533ec661ff3360842a90edb534d266ff6ab3005aaf12cba4 -Output = f7b6b8c1a446bb63462fabe291e87988c0835daf017db6fdb07106c59016a3c7068ca16d35b6e366b8234fb14a1e25b5dc531ae5be4498d2c3dc6817b5095c32a7160c73f097cc8c01b8f6815620e1811028d435b6246dd415c1b0954d632e438346852a1797cc87289eb733db0099797c9ab73ad999b64116f1725b133d96f207aa0d925e9bd26d121f9548ac1e66337362ab7ec6234afdd56dbba9cf9d9e710540a046a15f811dfac3da56e5c16055afed282d2648a229578cb68a72948519e69c6ba93cdafbe3 +[SP800-108-Pipeline(CMAC(TripleDES))] +OutputLen = 2 +Salt = E722575651EBEE966409 +Secret = 1BFAA9D892865593740C603E5024E404B5BD1CBC683662E9 +Label = 99685641B2AE3ED6C5378C29 +Output = 3BF1 + +OutputLen = 2 +Salt = E39CDF9AC8788398E432 +Secret = D189E4DA0750C3DB51EA9ADA54AF980DD84DC9814F3CFE80 +Label = 7DBD029B6EDF251C226DAD77 +Output = 982C + +OutputLen = 2 +Salt = 786DF52D710A72A32385 +Secret = 95F738DB9FAECD6E3CDF963CC7E343A4FBC9AA47EB7B9343 +Label = 87D5A097C9CEB9AE3CF549D8 +Output = 421D + +OutputLen = 4 +Salt = D6C1FD7269D6265227D061920DF9E4787FFD4869 +Secret = 721FB4849C03B203DD97EE94C1C2172D8044657B24B7421B +Label = 5850F2FE47968042832E64A6 +Output = 0EFD60E8 + +OutputLen = 4 +Salt = 28851DE693C361E017F468BFF1F3F76AA16A1CD0 +Secret = 55FD00F2ACCA229608CA8AA0C0DCEB08A620C91A5BC25993 +Label = 45229C7DA6A6DFFC2F650992 +Output = B643ACCD + +OutputLen = 4 +Salt = DE55DCC319BE8857D324FDB3629B5500945439F0 +Secret = 583375F79CC3C9CB60F3522D59EC4EBACED30235FF6797E0 +Label = 6DD86E6FF66354D37C253177 +Output = 48477BEF + +OutputLen = 6 +Salt = 5A06827C85358AACB3207C740DDE669F50F378973125F96B389B95E99236 +Secret = 415D5993AE2F28A70E591D85543BD18F4AE494D48E0E6B52 +Label = C54B33E5B5A25C7F2163D7C2 +Output = B2D8B23A5886 + +OutputLen = 6 +Salt = FED674D1FF3EEE130D348D546E26FB507A5C0EB35DFC3578FAFA6DE8D434 +Secret = A4E37C0B29607E2E6EEDF1566E892AF1EA1ECDC9D5F41C7A +Label = DC3C6BCEC7B778D79D1DA422 +Output = 955428F03D3B + +OutputLen = 6 +Salt = 377991B4A843350AA436C97778B215DEB5C8BBB600F0E334C9E72D8BE2AE +Secret = C070CE006E24E445DB9BB66BA21EB1D69CBA3FEB8877013B +Label = 816FD53AFD6E0C3D566D8F1A +Output = 671AEB3EB95B + +OutputLen = 8 +Salt = 0CE2BFC090CC63FB47F2BF23417CE9F233B5EB71423F5CF8DF24765123AD894718F1B829706E11E5 +Secret = 9BEEB4AB3C69931917F35469601CCBBA19E2041EB3F8BC58 +Label = B3E2A3BCF78D98E91BD91E30 +Output = 6C84596AB37CA610 + +OutputLen = 8 +Salt = 4E0D59BB17D7B7040AF7C000A9EFDEB1044C0DE6B600699CBC31E6511CD605C4F5FB544E889DBBBA +Secret = A88499FB7C4D563A1E915F64F0EAC97F899C9B1EF22D304A +Label = 426AC7BCBA36FF08C0794BA7 +Output = 68FA6AFC6F238E1E + +OutputLen = 8 +Salt = 978CD1331466E87B1BE6AC41605796AF9576BD633AA6D9F0DE722D03AC513F5070584F592851B860 +Secret = E2DDFCA892C1EF591B242C16C88095AFF7A8D84EDDC45025 +Label = E00B8B63B5A43CF33EAE8D5C +Output = 2EF48455E9118E70 + +OutputLen = 10 +Salt = 24B86D8D4EACA2EB17F05953C703AF7FA1E9A19F754118CF54BF861A470A55DBA81DE5A45E9E2E664D5E22CA18E681C06CEE +Secret = 92BA5388DAB3295374FD3351318D8BB6272AA8470211A209 +Label = F5A964C8635C7D3909244315 +Output = 4B8D6C6AE7B958543492 + +OutputLen = 10 +Salt = 3264EF74126A2E3DFFB2179396508BB9243B8743B6D6EF3073A5B93B60383D21E5AA6838BD0E90266998584B395CC114E30B +Secret = AC72E96DC2C9CFE248026B9776C09FF6D0FA6FAF3BA4997C +Label = CD0DB83BFD17C7CCFE761203 +Output = CD9501DC23D54D51BB7F + +OutputLen = 10 +Salt = 9B647809EB8133D2A895EB8E2062BF289134F7022CDC3FCCC9A85B89AF04C0C7439BB66CBFE05D33C3865C593D209C53190F +Secret = 25321A6A3EFC902BF9DFB39C56FDC470E0C7AD0C6F0D51F9 +Label = AE79CAFB3A905A302072AF19 +Output = A3166D56CE6A807F47C2 + +OutputLen = 12 +Salt = E9234007F0F8893835B48C80B55352B6CF17C0E4E476F12E3087EC271BA010FB1ECE3858C94BD0BCD14194150CBDA97B2DA8B03A6EE9B0FEE2DCD09C +Secret = 2EB2516D27749DB56CFA18879BAF4AB4A489D712ED9F85A3 +Label = 39EC05A5ACB2EB3C0E54B4B6 +Output = AC26DB762D9DBB024BEFC1E3 + +OutputLen = 12 +Salt = AB0D3FD764737285463B2FB921FCF769199659558DCBA1987F9C357B44CEE0327C8870065DBA53094DF1C7EB6A1BF9CBE48708D0485DAC76163F712B +Secret = ADDDDEB8A1A2881B365E4A3D12742EB42B5032AA5E48A24F +Label = A3D46F9339F7FD7C079C3F86 +Output = D45BC99FCACCB70F41D21ABB + +OutputLen = 12 +Salt = BEF545F538EB29E679F71A406D987DC62F0D3778BEC237E21D8D353806BD6CE6B9475D55A1814C7E9621366B2F3BD29A701677E4CF048EECAA4E9ACE +Secret = 6D99A2EAF62E4C6020AC5C29DFC4E84B45AD1119F73B7A1E +Label = 51B92251565F561E104CB589 +Output = 170B6FB6C70925DEDA196561 + +OutputLen = 14 +Salt = D1BED94F3ABCE6248729B7271E644013A499D581C6A2C0EC0107953B589897D5DB3440255C8482A0B281DC5EC63B6B473115E317F9B81C3E90FA2B350C780A39970FFE495BA7 +Secret = 86158BB8082B8445C102F828C7EFCADDBC2ED4E89482A54B +Label = BDFF812899067F84DBCFF97A +Output = 22325A572B72C7571062C7F18402 + +OutputLen = 14 +Salt = B694E052472EFABB10B33A89F5FCB460A085B63FDA8F62ED88A8EDF5A847221AD7B2B634D6953A459E956CDE4D4D4FF42BFCDE49BFA38BC82972C16C742452C457E7C4F475D1 +Secret = 0B703E1F5F6FB95B770CA6D2A58F85D4033C31B9DD27D078 +Label = 434334073E83B79436DDD7C2 +Output = E7B6862DB49F8CC878ED1DF2ACC2 + +OutputLen = 14 +Salt = 716F53A2AA851E2F0D57510DD47F04EA7BC04FA02DE6D0BF0FBF507BB46E0BD182D45F6F629C0BD07DEDBB56911ED1A2C526210EC26A984921B2826B6D25FED56385E033111D +Secret = 99413C7934DD84FB6598A5D03934F03D1D5FC9AECACD4B24 +Label = 279CD444BFBEE9D47146016F +Output = B266D4360EDB4C16C0E3C3440D63 + +OutputLen = 16 +Salt = 64283E42F8BC740996F3C3C25B0CB3092D4CA69FC70AAEA96C244C3830BA2B99556A6981A20CCD80DD4EA8EDA14C12D2EC0A07591A6FBD2ABDE13E3EA3BCBAD897B60582D0CBB0A6176E5534998488F8 +Secret = 28CFD54E6FCE313F711C68FA4B9249A851E99FEE0EA68D80 +Label = C91115144DE1B5932A1A7AD9 +Output = 33ED9ECE654CE964F02F6841A591EAA5 + +OutputLen = 16 +Salt = 9556E742E1F3ADF888DFF1211759D57AA552B1E0E4BD799905FBC95BDA26A85A7083F9589EAC6D220E0029D74BD73078D9210BC815282083068AC934F0CDA6719991F6333ED0819A98552DB43C271EE8 +Secret = 0BEEB99E5976A2BB4C35C241AE6A98F9ECC3C9DD4005B778 +Label = 4763BBC64F7D72C70EEA047A +Output = 90518FCA6133E0EB7C500FF74469316E + +OutputLen = 16 +Salt = 740494A2CDD08A8329E9E34A86562A5594EDB51755CAA44893FFFAC12216AFAAD858FFE1D1F81BC2A37F0043CE855440928E21138614DD4B7A1202C13AD9A012EB5817F3BB551A385ACAE1F45519672E +Secret = 7DD4501C02A9B647A6F436FA6A2F4D2C209D517B7AB35A96 +Label = 68ED779DE89E76B41C1D21A9 +Output = A4894BCC6B55400BDE17F3603C54A517 + +OutputLen = 18 +Salt = C05E5D961A7BEDEA468E1149089F2DBAC91C8F2B6A6993C679F987F52F8D4C03AD04DA143CF62C08DE8F25849E1BD3F0AFF567FBF064E769504EE50617BECE2AD9FE654EBEB181C21E2DF8AE42D527A8D7731BF5451027B5BA44 +Secret = 38C32DAD77677ECC90A84CF1DAE82E13580388D9852DCA6E +Label = 8B88CEF9ADBE22423ACDEC74 +Output = F26AEDFFB81E42C844A2CC51997DDCAEC016 + +OutputLen = 18 +Salt = 72501E11F27AF7D6B678B45E102EB53ED9ED28401A828E07AB0119127D7875CB192D48E654C70C604D139FA999DD70DBEE7B2DA3FE56B818C2E47EB85F9EAEE0AC477145030846344E186B1BAF38F764B3010E59F36BE99DEE71 +Secret = A4D17AAFF9BD0176574B4935A7F44DF2B6EC61EA7EB52F59 +Label = 8E897106E17A8193CE0284BB +Output = 6AC50F1A4D4362148F094BCBBD454675B265 + +OutputLen = 18 +Salt = 9F4C821A1CA1F46A4E38028D66208458AA781CE0C07A46B61DBC6B1AF5D9837C91A540FBDBDCB22A56AA3BFD0A925631F4E0163BDD821FAFAA095571F18DD4578E818FA5D0B53A11EC86920D9D584E5DDA465C926223FC5797DF +Secret = 821F2601089EDE79ECDFACDC04BCECF030AA27329226E436 +Label = 1037DDBC38DD21A577035830 +Output = 4FB6A1B737F21F30F17F81DB0D968761D7F7 + +OutputLen = 20 +Salt = 1753F289BAD0606B7A4364A1535FB66B438E2B3F65ACD862C4DCF511320B68685FA22ED935C41B9AF678BA6754E7F4C89B61B11CA926766E149927DB858D0E74DCA66F9201FBF34DC80B75BC6CA4E346FCD6FC35AAEB3FBF784AE4327F3A11C5125FAE42 +Secret = 78D169C282DB42CA61EC2884B7BCAB8011270E79E00EE038 +Label = 729D978124C6A1722B075F15 +Output = 050BA2DEDAF725E213D80B3A2E50D515C30AD5F4 + +OutputLen = 20 +Salt = FED6F5072D3B9820AB3E5C5091271ECE9CC35B83F175A8AE728DDCF90E96AF99F4A50ED6B737B29380712C121FB8C769D3ED2501C737EA08D129B2EF748431E7BE1282E931F0D3200396B1D86249E97A937E14A0CE4C1EC7C62D674912989FE951EE0147 +Secret = C091A6A1D3F589FA7EC75CD078350848A785AA48D443D34F +Label = 9D7CA06048F917713666C372 +Output = 241CF887E1DC5922F6B9E912B9BCDDD444B1761F + +OutputLen = 20 +Salt = E7DA5C0D04055DDF88B00E1F6270592E903B7D6DC2D87B6F30EF66ACB54D566CB8FA1EA3197BB55036B3FAE1B439EC87691A8ECF959FB27857CC8878F7173CDC1ECDA9EAD9407385ECDDC7BF827A3551584B068A7E31EA6504970FC362D44054746EA909 +Secret = C5CAE911C71DE1B4C6C1E91301764A44A958AEFA2F025241 +Label = 90A0EE259A6CEEB9BC416F33 +Output = 090D2CC1B6288BA61B416BFC6F3B6492B80C319D -[SP800-108-Pipeline(SHA-384)] -OutputLen = 64 -Secret = 818aa68644b2b4e79baf522a747fe0582312733520cb458650387a356dceb86595c7b4ac12edd2f7bd8db298f5cb5c53 -Salt = 1400665bf82a625cc94bdc39e0793d130077765d2ec44a428261643e6d665016f796274a2e0d85f5f7a92c292173b5f8a28eaa -Output = 8423bcb88a5ecf649a418f59d973d7ff9915e1c594835233edf176b094358c3f39eceadb8a6419bf459c0b572c6c692cb838536cd09607d9b27d0ccd3bd5caf7 - -OutputLen = 64 -Secret = c292f528e87bd4157e358d09e4b44152b14ea3a33e63faafba0af80e990b4380a699ad738194ad5051984bef71d276bf -Salt = 63a6d7dbb0d83217a319dce5902cc2c66dd2c0b714e3fc4e115a334fe5804141bc246bf8c749b9d1c2c839ff0b9bfb8ff0c784 -Output = c5bd04270a0018cf188efcd03ac887b393d89929c549561a7f19fde164b8f08db279da7bb99d987e911ac73af163e5868bb6423d2d0c08bac0b2a0b5678f2594 - -OutputLen = 64 -Secret = 6728f3b12de31a5a341ffb234cc41ee0f61aa23291e094613ae600959a49eed8a8b8034187028915912b7ffc7d4c89e8 -Salt = 8478dba5ae32e87951d079a595416fe97ca7dc760122d9afd974900b24dd4c0306e3aad4e05fcfd2f05cb80023244771e1ea93 -Output = da326b20d9a9c0c364f4366ece5fc04a6f3465da39483ee2be57f98af2ad7d8e5b74319e4084cc40b371c162e3d450d77c74e0e5e7c523a1d7535f40f80851a5 - -OutputLen = 64 -Secret = 91ff8183961e79eabff1170a03a6ac19d2725b3d1da92b71b577e0c63784bf418f7de4d7273364f43697a443e8c43aff -Salt = 55cb847fe4a8f0aec22b738cd28f715e8a78db2c9065d39eacae749baecc0148e6a6ee57c58042b2a9a8be1005fcb22d485a8a -Output = bb4523d58c04d574886457a7fdff4efe1fc2582755e361fc715d45083efacd10379c667beeba65717d45d28c370ab822158df4b1a46f055ec1ec64485a0fbef5 - -OutputLen = 64 -Secret = 934abeb7f9228da9ad08ca0f1fe5138f4d021077e6442824f8ba4f213e17ab16b0a0fbfaa2fc654e5841a7084a683919 -Salt = ae66dccf720780e6ff72e2b71ae37ed716f2145733d7386e6771fd96c99a8ea31215178d812be3188fc413b252c8c55d76da1b -Output = 5f702c7279f879d66568b34d13f7b234cc9e5e413ff5d7575661640bdab1379d1cd9dbb5df97b1192298f08ed2cf715d9e50773c06ffc45b8a141c548f7fb9d7 - -OutputLen = 64 -Secret = 80fa987ad5ae7a4f7dacdbe89c31fcc99a8730f02c1c2d0c7d7f68fcde02fe44e9cc439bce56491b570909cc164ef216 -Salt = 5596d67df9a33f5d61914dc7014ef92c7246a66c561ea4e906b681571869de1c85c75a4b4723b19c17665b72a466b1f5fe7d3c -Output = bbf53354cd0d9a67095b63abb84bc72fbd1d7896b1da68077581b8f70b26a5dd05b5a3cd3fa20749337837d612046362b3be93bde35cbabd91fdbc359a67c877 - -OutputLen = 64 -Secret = f83c0f6a6778857de10c3125d2db7d4246aec5d21da20eae9d0831e8b50972a558af53214b67b12dfed712a50d9d9f55 -Salt = d2156e950722d98a29f9cfe1189327d955434e7259f21b6ba6fd2bbb37c127097931383a3f28cff30b66415c5a33591c50e5eb -Output = 07c635a441faea4b86015bc3b72b7b9bd3bb888d99b65c048e91196478979949ce0f6421096359f8048d1fc5c4fb6b27f311dee509f2839b6acdfd0ef114317f - -OutputLen = 64 -Secret = bdcfca2d269603fadd71bcb19caee952190a5f281c1644cbacbe746981b55d51edaf72f5f5d31be0ca81a4b40b096309 -Salt = b67097fdd0bb7914c9360840c58c8a1a00295ff60eb95e849bc544ca66123f9b5369c72fb95537d9a21bfcb118fb7c459b5108 -Output = 4263e73cbbdd1f79e99cfba337937869f508e3d5c20ebbf5b405826d20b70e0aab0022ea50668423845aa4aa8338083d2be0d6afd7978725f567649c6d5e74ae - -OutputLen = 64 -Secret = 1e65a6f433d0bd0f9ac6c769971622023cb7fa4dc4101aba1160594dfffbf59c910d0cf31e426849e8c325bfa304bf69 -Salt = 6a71f5568844767085f6d8477bbec057a554b2f63afea10506e51d977d8d23d385721e926ec6bfd7cabc8f65da4a978a66e3b8 -Output = e2c1ef118330b9a0b9858c99b86a20111e448883737f1de592d8f6833969d8d23566d7e7ea9715871586b8c20ada10595e5bd76e492493b4847c6bdb0f0aca78 - -OutputLen = 64 -Secret = e8b7a15ba2986f7f346062869add76c19eb3fd639537a871745dbfefa7625139e5c15937f53c1d71e216616c0d1b1357 -Salt = feb52db3ecaf44705c41948020b3932eced28c696766466413bd5334a9db52ca126b7400bf8a17329c4f33b41da063e6080427 -Output = b96352de61f75b47905a75e97c6a27c55cee0f0cb0e58ae109b92ff29d48902e9fe7b7a9889dea7c6351cb828e61d91dc960c16aef41388cf417f3b368e8b25e - -OutputLen = 256 -Secret = 6c29f38feebd09334a812a44592bf9da5f79b6740bb7c033ef0892553c41b726e22ae25367ecd00950973bbcdfa117ae -Salt = 2008b491b64cbadaaa388f2f699ab910bc55200867a11f7b8dda0e79a0bf4d6375de10346852fc4bc484c5adb64c6b70030229 -Output = c23274ce8dfd84350b0082091928bf2d178c51332223bd6f2368b1ede2bd39bfb03a5ab3c9a1d41cd0718bf21dc2cc6d7652f88bb9c493275f703d240fd93abda291237e634f7bc59480890a96f88dcff4487e6a8472643d874bb1858556297bb58b086fdd7bbcd98f1e6f528a1e1b5b71a55da57ca5f58d91e066f680e186edf9fc2b60561e854bab3d9fa84eb6861dc2979f727a5218d3a17f84a74be1e4cf575b9b250802d9d5bb37e675af16d5d08af91302bc347dea6d0f863f1ef54977444b9095f724fef96c40a284f7638fcbe960805f2768e0de830e929dda7be8e4c4d9bf9c8974fd0392b9d662d60d478371f5234b088d9378e01624c6e4a59f4f - -OutputLen = 256 -Secret = 2574a4ea0400cdacba99fd69a7db5c6fe01eb5eb267f7fbbe1fb2222777903a979359087fa00263d7948b602ff121cd8 -Salt = db42f4b4dfc2cbf4235c5dffc6a9e869f3fdc65bd688986e65eed489f084c3b2bedb7faa2b63a8b64d18597b110647de1710d1 -Output = 24ee8c98449fb1b44d6a9988e46098a04a2a05ba5c31edfd9ff4c8838edf17ec5bab560610cc0ad01c8256502f630ac8ce3afcad5d40c47cc37bfbbcee674c7b6dfd2875332fbe86e6b451d2116a5cab69e2099c0954ac85defd60a3f5e9a239b0bc3f80851c2a36ac8839f4b432aaca6a20d7f4838667f94bb27e09f7f3830ff0ee04418ae3bb6ca34017185c953a603a0ea4a3b962224a3197868bc204385d95102f04eca9e9fc7d8ba08ad8a8a088c933b1858cd8a4efd5b367752314c0c7784e3d922da50f6f10bf8ec4eea898912f5a872a078c8f93528bf342888349565f9a82e37431bbaad506efabc51bf748aed17cfbce6bc0770b01d6591226bb7e - -OutputLen = 256 -Secret = ba238ecf2380830bb09631671d87b35dc3b463dac2d5346cc92ec0491d7c23a6b3cdb57ff2e735281f731b4f3d4849de -Salt = 6c526797c01cbc03db339a295af535cb15a8eb1120c5a001931d57a069848454a151cfcb69e3e621927eec1caf98c2e0ef53a5 -Output = 5f9b8a13e72907e3ea7fba0a023592a23147b001c31c07c1891bc1902ea1fe1fdeafbda7c38751f3e9566ad7ac50796d272b5b83f0e58c4f36b28182838a9b4a438034ef83335be3ac1258af2ae61bbf13d65a5e9f64f53668fd1345353c7d8fe183c6447428ef23c7a80970211aae2426b5eb85a5fc92ce693a79c8830f51ae68bc0ab6f3f8f12168dc36b1e37bc7d046a9b0273b627d40d5afe074dd8ed7f87bcb69f802be3e0757179ed8fcf96086d5212cb43c7b10f1bfd88efc25c469b251a2ce13ffbbb737c7e170e18a2dcc4315f7c28f46c09930dc0fb06a81d1183e813e753941b7e15d97dc64bb9c4d77d8d82376c7fc94126c522711228148afe0 - -OutputLen = 256 -Secret = 7658d89487d8d898cfab921dda8c6c7051c3f8a243781b4e9214496b71847cbd2e877c8ee050067e7edaa95da885c3e5 -Salt = be8b60980c7f89f9e57e634e72494707590c0cf9c70baa0e446cb951c21becbdfff291a029dd7bfbe3347d97ea56c9b55d9355 -Output = d55178858d16425a3ce79952f6bb6ede86bf4051b3a2de1dd6513a14cab7b3ad9f9ac6ff2cd5b335638b80dea191e47adf7b32f40b71252062a9e7a122047d0019280aa4b36abdd0cba69d25a32b279cabef8f9576100743385c2d7b55fd663131e9e5e472cab23cd8aa163f07bfa91ae448af478da93d79190f519bfc376bf18bacdd25ebe1ff510f05cfbc2f11713b5fdfc1dbd37c8d24d472122e1be5d3423c08dfdff0e6c43fe6c2c813caa6d4c1787de2f88ed5086ead2ca9b6e6e034b1ca5e92d038ba030eb021877c0bf72cf43eee23c96a39ba74c28e161fef5a1e3d531652f7449b8adf57fcd5395d3ccb31a977a160823b70e43474c742119088f0 - -OutputLen = 256 -Secret = b569b043c22598db38fe790c7743ca374749399a18d0413c0d662e61ad7abae9930c81f9dc2867ab48a153e0b6b11b94 -Salt = f80364fbed3b1a0ed927ee50ddf54f14187fba1f00355731014aadc9d4f49549027ee25d8c3e79b93f3541a5292ee157528d77 -Output = 592f220c4bbe5eb3e2ce5f559e07e06982050d7f83b70f9c41e4ef51a1ab15316c4284a4b294edc0cfbee145c8892fbaceda1f2db839f8d4293d69604d931198d989cfbdc454bd2d408b09e8fa1c89704c568854b25af659df46a1b759dd6c3b91f32fdf83de026e70c4056d15fac283061d4b5ef16d4fbde8e856f23f071cbcf32667a678046ab5f982cd32fd691b73d6fbd1cd039fe02519a5b3d2106d846a729baa38a020e3d95a880466a73671db2ab1450aace97a3fa126f24189b900a2ef5d7d66eaddfcf0cd0ec14f43d16ea75ba299daafc0be2fc5aa0b229be51311c09026b0dcb360557b0d023edc1e3b8831f02fdeed3435219e75af226a42ec99 - -OutputLen = 256 -Secret = 8fa517d3181b9c7b284de8f5a9003f74a9969c1d8034d1da444daa614f392ab242c37c76cd3a833fb01e6941a66cb830 -Salt = 9a54dc04fb006a5c0809f439e9cb55492011712442ec6fb101d86dcbf95dc631a37336767255b534ded79fb0a5c534e177d939 -Output = ceb9438d002edac99fb867698ae61781cd23bf3f7bcfa458072beb8843955e910ce2b1308c5bf658202907d892c6c74b1f5e843c76c790561ff03256d8f5ce8da0c32ad26162ad15bb47740094a48829fedc04ae714d78e338e7f5ed63b33c2a99578dffc16adceccf05b8a74630bf332f4a587bad9a2dbdb4077cd0d57025ef6ad3c405ea9bb7a2a6c7390261e21c2def979aecc4f4814190807c45879fc32de6c1e16cd73f97de8069f5d597ee16f4f093352a65bdaea0f3b39c924cfc52ec163f06e9c044f44f40e21892e5c3d77e44ad81ba8454dceb0322ab84076416cb1922312ca351276ee8cb660c62bbe0d431b729cba0ab31902527f7d776dcfdf6 - -OutputLen = 256 -Secret = e5896b3cc10771c3f1abab179af7bcd9d571eaa13785850d22d8c7e9ee00ec25b61cb65aa10fc196893489c7ed8d658d -Salt = b4b8821e36995e5ed7590ab41802f82e44bbaa3f0db2be0fa7c465f913dafcfa8f79977a59a4ce0bec07251fddf1ed037ac9b9 -Output = e6428dcbc7e980fdcd9a5b9f77ca28b05ff1b1f76d748a8cec6d0735f594c8f9c48a1022bd07ee65e383de3e01982dcbaec1ee9da1949b998d5ea31603e8042743bec39f9c6e320824aa65aa187b0e37520f9430c1e9ace952ce55714d754d63594a51bfc6f59a0df5f297b7397960976719ddbcd5137b53a219852cac4c53a87ee4f45a9cb94512c61c00fe48c8fa2a1c5c995ae50b2369af09366162a30b47b4367fd914af3ed9d12719e096cd3fa8fc79e1374ccf859b41641be97f964b0e7d1356c6e88a38e2e20067b51518c9b3857db63327c08299c4cf3975b7d57706b8f0195628b45396ed586e99170d86c97a76fabc6d18b911ba62f7399e260ba2 - -OutputLen = 256 -Secret = 998cd0c04e878954685ffcbeee6d48b7e740a81aeab1b65c4c9dfb73a8cfe00d2c31b72321883e2bce0acb80d205e846 -Salt = 9710512468f99c048da1e81f4fd74974a79b641fcf8531141f3bf87aa1937650f9a4c387f7b4a4840b7b2681e35c02a851c8a6 -Output = d0efa3097dd470be38c971544a56a0088856c943c06f6b547c8e189c0b51e3d1bfa6483692726bc55ae21cbb01e2de0476d53036153e5a78deb4d136d3794da744fd2d6bd0eb13664d233350976b34b7bacc1559d7f0a3755d95d9b209e1dbabb9883a345dfaaf1eebcb3815ba565cc854e90da2e1bc8b24324bea057d84ee6f7ba23959e6a19ffff0c9e9b0a9eceb833a4204daaf7299d5338856e1f3df9d805e94ef88c5c8a333c9654d432a768d480fa9c8533ea0a71b22992befa6c92dea49f1055bd35dc8ba6ade7ea004a548fff0fb58863b7fc86508a2b4f532189373cc6a0e4ca8e95439339e8aa6c1bdb6bbd1262095f431086722bd35b813391abd - -OutputLen = 256 -Secret = 3df83143ed511abef115d15bad459adf244ba63abf97e8895c22a34eb46005aaa082832216939faebfd7737edb58198d -Salt = 75526ec06b0e123f665ac50603763d0da870fa101e4b3b74a76024a0018fb4b6e8abe59c1c7f9241ed7a2260901f75312b2c5a -Output = 37d28171bc5a6fc9f6d6036b069b2246e655b7eadc82ee694f9feb7f90e47af17f9ff0df703d3d3ba371cf4fa6cb50c762907e96c545747f88a8b3b81f793e08a8e42c77c69a48814c557c509ba1cb52ecf2c76c9e92109026d957b9b6ff69ba58a3203454a70a588bbcb89aeb1434b78728ab7d0db51a270fd66e59a749fe1c3c1511e32430a0367be8969da018e1626441a992d40fc8a3b805df71a85f632e9d695fde73854e1cadb908e0d21a5d0dbfc63cff78dd277d7299a1330d249e6dd87b3c2cff3c4f1908bfb1061b890f38ce9315c63f1e89599158618df563d23ba8772c5377c7acb06f12b355986d9fb0f2853b1016563b965bb20949846939b3 - -OutputLen = 256 -Secret = ac3ac7f9dac1200083c1428552037db37db0bcbb8b525c406d01a7eea0298ac3c8ab89d4b98553a712c0adafd9397c9b -Salt = 792c93147a16776f721b1ee06eec350321e905e460c2e256465c8ffaaf7974ec02940d18cf321087c5e749a84f2ff623d0e5a3 -Output = 3cf7ffa7817029c6954a9af3cb21bd41b96db4357be8429a68d4f394b2d9c6223bb306197244c4f9dfc895ee030b68943a094707084cc0b88a51b337a28b94c1132ad93c7c48538b6860ece55fcfff1f1d2b28236baefbfceb4e69fc33a73ef8a5d4e6c3d7dd6f0ecae4afc5aafc0457ae18065b49273720bcbc5fde5f4c4e61ad6188dfd8e3a79bc63391dc290edc19d03b677aa56e3ac3f6e9a43c54b3f6b9bbcec23f51c570823757acb83ab49a4568008d2317264e66bf6014e0b67bcfe889e58d47b8e11184c0530c2f50ce40a286c1317857e3b10413cc9876fedf90ff8ccf81cea99f4fe75b257c8937012e41b6331b2852c2d8eddbd8b2b33e2c289e - -OutputLen = 70 -Secret = 91217e806b1d3c5344e65893cb62b02eff8425d75760beded860109414ee65130fa2facf0fa8c9e6b760e3ce4e324c3f -Salt = 33a06d4e3440ecd149df93ef0cc01ed12e93661de384822ae97696d05d6b6b5b55995a0b433f0303aaa3f2e6242810485c219a -Output = f1430dc77e94dc35ad677b6af6b794e5e872ed33c1af5515f213ca9d071c182cee30d65086e1227401bf62f5a664723f699ae0b213b9e21205b5699993e38e3530cab6c3a758 - -OutputLen = 70 -Secret = 43fda28d6c87910ebc32f8c2ae21a6f84bd1b5811c4a599d3d83050bdd875a94116f639565bc2790f36835671ed7692e -Salt = 0df8850c1f8d858b9d84b06d2ed7ff22e51bf1537ec7ca559e39d1ee46b088415c2973245e8588dcdb7a2d5b4ef34e6de302ed -Output = b66e9c2134a9f46cafedfc9b8628a673b1296e27fdc62631ae88d6ddb3c4e6be6cc6c9f1103d0ef8b6d58b277690117d109c0e8f065e745048971861e5f09666cf708fc6712c - -OutputLen = 70 -Secret = 1f1f1c854b623f0db8682bfcab5c3429a72a077e5c804d366053dd645cd5956c0d81a2589f0ed093ed0c05b8cdab14b2 -Salt = 88f22d9f4b21b0fce02fc0d14254a146e45e0335b0837918bbc9967f2d8142c3daf688d2d403304149f79f9d654fac3480ae04 -Output = 30d176bf51741a773955e5af7776e5c8e8bcae244e1b68eb981fa89de3389f0cb8a1a85ac591a77675774a8dadb8bbdcf11e285648f0eaedd17370d3d6164ca54f62afed88fd - -OutputLen = 70 -Secret = ad0203ec0464190e22f7bef523e6649883b18305e564b789270f7ca553bfac8c5d9351bf9db39eb20f0ff6ebc3b33776 -Salt = 5b264d46a8bb2ff273cdf9f4b643c1aab15e3629ea6717124da0475591f8a4457057ebf1db99ab53aeaebe3560f60b3d44f333 -Output = 7c7bb93281975eb25bf9131d1e05a6a93e843d07aafcf1786a4b852a52332b5390bf1ea69f2028c00d9ad2641dd4ab5dee909d7f702e1b5056e77f78143841f6d185298d10ba - -OutputLen = 70 -Secret = f87686bf2509891dbf23150ca2ba201896e2866c35289fb70e47b2d59a309306875e482f947a62b23c46a97281bbdd4c -Salt = ea7a7304f2b6205ac77ef2cf60e73795613bed9e763c99e0ef9cedbe1549a85721a4d7582f090b5b113419d79a62885da52b86 -Output = 3026f99d22f947bad54adaf9bef06006f27b9a144dca83b4ba8e949e382bff86f46aec468ac314a6190c89e1f98cd95491c6adb8d4f113893878b5936b6c68d84299d6741ed4 - -OutputLen = 70 -Secret = b19a320267f9ab19d112114c1f357b08fff9ff206d78a40c85cc603340d53940d35da985002fb1b1a95c64a0868fb416 -Salt = 1c9090de2cb1a396f7c5abd0c7ae84722e32e33c30b48c0b4bede25eca657cacc48e435077891ce93dd9e448bf8cd7420d98fb -Output = 5b8f0fd7122e9d79665e5e5f9f0e4d1b76b898b772275115fddab6513a760985f2e8aa827cc7c4bd1c34cc0e428777d3a0f2c66533deca83905d035108893da1c72db27ea09a - -OutputLen = 70 -Secret = 7d80a010c4829f2514cd4698d3e6fd50670dc9a90b6e1613b31721f793853eae24367e65fef8de4a2c9a7205d896847e -Salt = 6f0845afcf57d760c9cc674c5839f7be55c980b7684203a9ab4570a87898800be8f09fb7488fe1dde183ec3a4e44431153202a -Output = e8c2f71352d742c2c802a528a9af32efe3169f2b38cffa2b3a3469c28d49c04c12bd88e9a3d2de06ed15785432a85ce26af507458c619bfa0f2cbbbea31e77265c9b2a5afec7 - -OutputLen = 70 -Secret = 23d08a4f9f268b8c11cf7eab25c046273548abb52945e8662ab6329a12de16c6aefebf7ca39941be534e24c1ec530266 -Salt = cc0f12e1ac4588c61b2c086891f6fa96c1a555aa3a59b5b2310d02f4bde474ea6254ff33f0a738579ac6750f0d0b9501dade0e -Output = 84e7cead871d7c55a89109d017392af5d620cb17c0f5c29e96703d061b6ee9505ec1a7884956a7f01a2efe5ce2333f5c05faea41297e5c769c66afe19ec2f577903c5a5ac7a5 - -OutputLen = 70 -Secret = dcab684b588387cfc297fef93293abacd84611d70216259df02a69e1e3d27966eb16ad3f443c8604ad5720acbbbedad4 -Salt = 4293f188aab39bb6cffb7f93d5f91095b369575e846c3d3808c941402e83c77b0f97f7235e647e8fdb67e4f1a07520538e82f6 -Output = cf441c3ef7bc465664028343acca15c9be4940f05a7c5667928e2079d033fe73701c830ced086bac31edc3037036e2681b1bef5ee91a17b210a2d4567dc3fa31f7164d0e6c89 - -OutputLen = 70 -Secret = ea069427fcb2a5d005cddc63ab1681d3ff9b6ce5e1693ac3cb692b57c343f92ba2c9360c5a6e91c58c200b837a332319 -Salt = 9be32435d9cfa5c1abedacddf04c994d515c6b0d5b5c158416f53e34020cfd2760636c14f19945f1093b383f42641570c23ea2 -Output = 85a95d4959318a7b5453a9c537767d20a04bcdff35a81c0b45788686338c404dd1a1d226f0e70e3adf05c24ebbec13da3f97a4c772c6f1db06249bc2fcce65b8fdd3849c810f - -OutputLen = 200 -Secret = 267d3045d90b3221df23f8594e334e20b3ee78a88b43cf51c60dd69b91b0c0f3e9af15f14a8b876e7dac5291080a6ff4 -Salt = e25290e8e1582d3e69eb2a58c5f392b561d14b08ced8e4ed391e8276be4f851479ec67830691e8cd8b24f3888570d33e4fb19f -Output = 010727d88cb93742b9f1440da6ea1ed33cfffb4c8bf5bb3a1004083c39745420e44cca8589252094bb931ee416f27bc5ccca3706a1852aa97e617955381563b6c24472a649b89fda8e265d17720f900d424033dcf1cfcc32785cdd0d1ce25d0201ba8c62f3afdddc7e5a5536a0ef10af6b072dfbc51cb14d0d3209356f92a127aa04b4c3aad4fe3b9642f118299a31f83ba3c5b7dca3cb5b52b3ae6e063ad66c00d74dfea38b144150dff65762b0f5239fda50c698ff7aaa17d1d56e33076ee013977176778a2161 - -OutputLen = 200 -Secret = 6674efab90ff845e7d9196773b9ecde4d774a9d5c80c00dbbd3296b2697a44b1121e0c2f1235fc2c3d5fa460d68279ad -Salt = 39dec5ba311aff95677fed1df759cc7965092cf0697869f0af6a1280bfc4024559a397191438d78d256118d1f1b9355eef5bc3 -Output = f1ab3f401ee544213d2024244c8e41dfed160866f79dc0fb8528c0d6051b7955c0d576ef9552dfcf554c3c93384aecf62fc540ef9b23af8786f7f5d89d190d2c9a1bbc1aaf060f77470d419ace57c1934149b2e336866cffb9bebacaf7c2e19a43e00ee0be459834b4a83598dd41d7a558c31cf9ad3ee47ed4eb17f92207bf4bcdcafa69e5e140e29c615063ceb86eedbe99fd2537c9938662fd10e035b9a57cce06c6ed4d37425b71694532407dbcc1db5fd8142aa0e3c2d3501912c6618288a9599996d2c26ee2 - -OutputLen = 200 -Secret = b4cd9a1cf3a4a74f67c23715c926cc505ba4800ce84d02f456709a1053da9fff4674254171859528042e0aa0a0dcd5a5 -Salt = 78bb76fcd131a24adb4edfd6ec4935cf9abf1a938368c407ee470ebded5e0691d443aea7b71a74d3ecac6c38570099b16c0fcf -Output = 210d4980d0812ebbd20ff260f5102e1843dd311d03863df28c40476f3ed55f6c76a628ff7792309e4a3c65becab49fd88c11b9bfc03fb3671aea1bebb61c3b6b069cb2c00cdd759bd0a48a4a030c04c2f80203a95320817f43ab1d2252229cf9065fd747cb11118c598b667241a818e8646364dbad519eff8bcb094171785b3ddd0e49673cf05dfcfca8e6d47a28b4d17fc7c939e80c283d8cb93742f288daee56fbb3000213c7e399565acb40590dedc77fdffc7d73094a15e47d512065686538bfc4b06939406b - -OutputLen = 200 -Secret = 5175624bc2fa013de293ecac4f3d6646efde00173ea5b071d742381194e197f5cb0ccd3b2bbbfdaf71d888ad0e9c0fad -Salt = 6234ddd147968f4ec8a88cc51ee7f2196ece656c3816de3bdcce42c15480bdbf75d6c3c0edbc78cc0f6a010f6849ddfddcaf09 -Output = 55a6bbee07bdba9454b37b7c36ff509f2c034649e7d2d31936c28cc59a1291ecbff34aafe3092b14f3b636142f9d41eaafff4131a6c7378a8ae3b560609f5793deec70ffa0b2513c1da9bbd3a4a52a7b27fe0a4dc90018864a0306312e6a590ecbfabd7100ed83b8f712bb0ec0a398981eb9878954add2e61426b1a648bb6a73d77097e841071b9a5ee2c5af2e8434d4fd12c4e5fdad92856db520cfd5adc563b139c1467d3b88389fe91405d34422137cda3e74e4d28f601a1ad1efec279210941cc49dbc3e8eb6 - -OutputLen = 200 -Secret = 88d6263ccc6dd30c40a7bcef435155875b42edcb1eeec5a555379d50d9c9ce02dab19432a0e504a53cff271594d88ef7 -Salt = 20567a849f0095a9b1397f5399829863623e5fe11dedbda39c02112ea8c7e5d60af4b38f6abc94f441b7efcd889eb3ec256aeb -Output = 7412b76dc281edc543b128d6122c82544c90d4fc0c5c6bd526a303e5daac69b0b60cd7cee8ce8950ca485927a9f4fc80011360f0f0bd7a06491b95d9df80aaa3e0ee943de07f3cab043f8158148c4cadd92f73dddd5b1c310bf6b31a43499e6072f417f58224651f5542193cdba348681fd4a33c7ad1edb6a90da2cb94fb1962b13ac71ba9e04a2a401023441257f0730d249785941cec3f60e4809e9cecd053122614260d3604ef934bdf0920acb94c29b0b99ce3db496d25c9e5a7b4d16251e588fdb6f4c1c45f - -OutputLen = 200 -Secret = 877dc7c64ba5b197d3b95ef601bee11989e9fb14f0f3b6595dc064f703daea77106de0920430d4beccf8b934f08a0999 -Salt = ab5829db328c2b5b7b7cc5d8f3e9ef89e0546d7168ecb27d47fb5237b8c29590723bb5315e0c629433ef5b57e33d41f2b961ea -Output = 12ca639c780f0b9e038322377427e67ffbbc1885d6ba971e18fa1d19497556155fda109e5336aebfd1a5b60e21bc06415c5fc75d19c137ffe8cc68efc2641d19596aa685d13932a39a4f2f5892d87812e7e48c0d055866a4f088cdd6d8e599247a99a0e30694840a169a42348577bf4c80557ebdc67465005d50150520121bf94b3986b31fd52091c88bdb6e645665eef5412a788cc05df094a1b5d088dda999fc520c4fc8b34fb16276cc96235a9a2b02b41a3cc10e66db52180c75b0788998488f05b8b6144585 - -OutputLen = 200 -Secret = de3929749a5f1ec16c88d24b564569e9871eb8568b3f99df93a8de3158fe9b43ff2a58c2967a0f405822698c5262eede -Salt = cad27d4b2c01924e0fb46d3a6ee9552a9dfc1f59d8dcbcee7b0c894cd986454b551afa51d24a84a34fcb877479d99e291d4b85 -Output = 18cd390a61e366c337a855f94b067f17607e710d898df305f8e2f4ccb7bc323d66704e426f6a8de918626e5876aabdaea055cfb6fa87d76f92fd874e8c903b351f23bd48c4e6fc167dc3b43b7f78e7fec196f2c712230498f268ac50e4df0afe9296ce36af3bef63a93cabb5c7a94e1fe35021ff82a10d72a770f1c727ca79caceec592cfd830fec967028a6eab9f98ff8bb4f036dd2fe114327a0d5ec546d66a7e5a56ef815a7e3e1235fa20e455b5aedfabfa0404d8a7711059d9b1d5ca6a6e9a26a265f2e9a27 - -OutputLen = 200 -Secret = 352a1e726c368a4b1b600331a2ecc256e0dcd39ab9fb52687c1ec7f9458c4d0600186547eac3cb01119fda3e24fd8e71 -Salt = 87d95fbab35ecca463047f8928680226de896546af3022969b4daf1a0bd398cb1c1abfa9da202d84ca85f1cafa7fb22e65861e -Output = 03e0ba598c9fca48c0dd1f7cf1c2b3712acc992c6a3e7df85cd9c3266546e2ea6f8fe4c8c0214d453e90ab61efdb8b435d01314ebf737f170b931c3bc3c8e8396c3576edc2c875f79285e6c8226fd09882e1ca28279d875856651dffdc8dbd9b29395fe28cea63ffe87eaa601017226ae39ce58db7d37c15130a377053f8cedc9b3ab754ccc4324704a400a5d6dd0102edf41b542f89b56cf7f3779252ae2df2cffac87cba9a82cfd6c5d3bca970faf2c70d3a3826c3b152b76dfa4e50bb76a51980d966c8bdc44c - -OutputLen = 200 -Secret = b005f39c1039d7847d1122e44ac70380509ea85ab3f486fa35267835a9ffaf97717cf2e66209c536c1bc4c5e2a271ab7 -Salt = 17d272a7a6f249e547f6c777c645c33de5292750e5deddc559da3b48efff299534e7e258ca42dcde2c81eef8b867c9f7b68bff -Output = b07dfb6eab68992c4203638553da5ae786277c3f42778f0d45c3c288560921258e30979cc812ab8d7db0a75726d4ab71374e3e3c2409a931980b319898034470d1616697f8b70f50b9e0342a393d249018aa10d019f5767ec6cca4ee8cbbb6b22df8975ec6b91184d15e38b3179c4ba38eeb14c60ba0a249a993689718e623b24567fd34205aa4d09bcef69a3ff4a456258cc478c930a1ab4c5726125900f884c8b6f47dbf5a5a7232b8f578e5ee79ff8ad74ebfcbd871b30f6e7dc1189354ea87108311cb1be5dc - -OutputLen = 200 -Secret = 8f474f066a20787286225bc070f64fc3f4aa74f4c87c7babcbbd7d644c104bb88d99217968d8a8876584cc941021a5a9 -Salt = ea0149ede35d31f44fa1c695d9b3ac2ebec32da6d7584973beb29356d6d3421d938a58bbeabddb3449647372e1d1926601815a -Output = 03e5b620d09ee9a4808abaa0726e57b41bb2f88a8c88da2c7acc38e8e2e4fcbda6c50a419fad6bdc9ec8a193a01ded033b58bebfcf0d476dc580ba0a6db9e30cdff6f28e9bbcefa552b378794b55a35732140ab9f6acfa82b0858a417e502e392d787a69c8dc095befe7ca1e384d13415a54d9682038b28bbbbed06602332efb4fe4a5f41f2177afbd3bee76cff61a66c6102c5605c6ecc0d0b5383d8cefb7df1f6f34023e9e4ebe71c8faa1ba24e78e794c0424a061b6504bf5065df40cfef59e1e61cfaf6d2c37 -[SP800-108-Pipeline(SHA-512)] -OutputLen = 64 -Secret = fa016a04bb256af4606bf2472b7eb4fb2344550aa0b8f3690746c5260b2ea47625d88b74b4b6cca0f9ddea5222574e4624a66d7f28bfd0a54c2338fbbd3a0050 -Salt = 6d0c444dc0e9daef0c489e8dcc4da85c2f66356f4f11959f91348c985879e5c2153f22e4ce6baed6d55444c48de384465b68ab -Output = 221b902e67cc680f6deb5bde87be6f21a3fbe2e216508451dcbffcba4adeccd2ecf4d0e79ee83a201244fed871a39c2e181f241c3c75d4f71c052aa9887a8153 - -OutputLen = 64 -Secret = 617e1600ae42d3c91eede010180360fd9996efe97a091a3d8bd5b12ef82928b63d283775b6de41a32ecb196e4f0ea63425225aef53303e736556e63fc11114cc -Salt = f4b20a523d8b231db51ed9582a773a33d67fecc09c4f223ef872ae2c4512bac49f5a815647441651278d3b4bcf09abc75518bc -Output = 7e73a421095536a24b9c376542c557d8377c88eac473d91749949b37a2bb67d72eb41283badf2bda874dfde07e2a1725cbda98ab57cc236969f8584cddda7cd4 - -OutputLen = 64 -Secret = 4ef20b4efcd5c15f789aab11cc1aa814a21b2b2496cd383bd91373e653125348c77dda00bc0496e3fe928ed850e2cdbeb1f98d86e9b2afac7bf1c70695537b26 -Salt = 5f892d1fd33486468cd7f00745a1366d7777679cb9a76124a681fd75ad573a75fd76dc3240b7746eda88ab4101dc6189a8a3d6 -Output = 8abc1d76d766682bebd308ec991e993f49b527faf11bf96cdef0d95816b2bd0d8dabf68e2d9628e3f61ba620f804b99626f373fd78a21a7afb6bbdb880673220 - -OutputLen = 64 -Secret = 8cab815c4807fdfbcd2ac2c9a005410d70bf598b5f2cebdf7ea414f83cdf50352626c8327e363c439bdf11b0d6fbdc06be995ba8d50bf197c43ee59d057e0a9f -Salt = 997d871c3105f9d9a73d8b014e27cffa684d0ef581a78829ba341d5a8f55596b9e832dd5fe900d5b7110688f6c983221132751 -Output = 2e9b5339e23648aa1b3db6b4fc3559d6aceea26616e7cd968ef566965251192e86fb1133c31936221c3a2a698d9d39e75fd7cd5146324b152ba772c4c4c91f40 - -OutputLen = 64 -Secret = 66ba9fc36a8d095ef88a96db1d1145b291e546b550218ad7d6b7b66c0bc1096fa40f11bdbf54966ed1d19e61a2d553bd329c8e461b2dbfc57e3b063ecbcb85f2 -Salt = bc167aea4a0bb935013c6984803a287726dd2cc2697ee5d6d139ca1e46ae7ae91f09307df3d913e139af753ba6c5fcd6fea7eb -Output = 7562535546efbc22f1272ddd3c99645532f96066fdcf1af6706c3f3ef166b78fc36b52bc20b1e3f087bf53302def7c4f0eabdcb65beb092376637954245b1eeb - -OutputLen = 64 -Secret = 459f0903e8aadb9fee9e0f2555a2e5fbe6c35b85e125faf6bf96fc8f8b147b3a3183bb883d3cb9ee275b0069b9f192618d9f49abffc349523ddd0f7ed65a5441 -Salt = 4291fcf783a3bd3e5f620170d550daa3b8ceee63dbef74a7fc94fcbcc15cc54902e43ea73804e0efabb0ee04e5443c44e9a5d4 -Output = 8a47800d0bbdc51483c9484b55e2117193a5cfece9f45906c27203f784038bc8b2d6c6ef64015d7b57d8d89e3b54b0f1f6e6c91e24f8b64547e9efdffed6a654 - -OutputLen = 64 -Secret = 6752587bd0f686dee746c08507773b2449a75458f722c1558da373c130139206873da866665215f40c4ab92dacc24543af8e54f14c9a87463d44f7363c19ea46 -Salt = fc8342e72c4b7a692d66a06c629949b2f73fb75b011f8a3cdc659a6be47967906f1fc2612cff3881df00e9d58005b147bc9535 -Output = e378077606cdd71b27e6ff7d3d81cb0c4b475515120bf77b4a6394573bb056c8646d950a42fe30c6977b65d8232fff7cdf675575e2977480f293069a760dbf1e - -OutputLen = 64 -Secret = e22dc8b66fa459fc40cec22eb9378d1c61c6d57e43491f232ba27a8ea19002a5e08fea8efd08bcedcd447ab07aab7240b1072ba976b20230492fabca42056b95 -Salt = e90be2a2fa6d29ec83f8b2862cc0c8d3f13ad4ed4ad5be31366f7776a9379ccf35ee8f05c103f3288abcaf704486ed2e13883e -Output = d3d1ad6909dd3d79bcb0a43d2c16c0ad774bf093ec7867ed0d27f9b5bc525775431add1009fbb53c72c905f0f6e67be62e0febc2c8ef2a9920adf5b345c0cb4d - -OutputLen = 64 -Secret = f68d19b72ec30ba0eae0a34e3edb1bc221c6f683e7fca08ea4638eb08982f0a7c3fce6e083c4986fb7710ebf9d0fffc2fa3dcd0b97061c767b161b95c28c1885 -Salt = c723fc6be387363c9412dffdc7aae0bb275fd0fad7902b4ee073829f9d7204f65721f6eb0f3583167c2e0059afb84544d82d24 -Output = 6506d45c755e5193003d8498aaad27e39f787be246f5ca12b8ea121c8d34e788e592d19427feed5959eda26446fcd0fa5e356017c3a16a5fdb5074cc528a0407 - -OutputLen = 64 -Secret = 10ef8d66d4392235396e835d5964ed857d40d64298fb052a1305d392a941dd7f057eb4d4d73ab3aad1ae426dcf8832f98f9ed49efa0639b0e03333612fb74b1b -Salt = d1aa5068d97c1cb04d530f04661b627b9b9b9db86a550cd2d67d80db8b9e87714b54c711f622c702653629218a9c182f99e500 -Output = eb6fb9ebb276e176f0349a0a9a57f20aac0a51115e51d94698e2b89313e9b11399971834224534816ff7d2f5c8c6484dc82cb19b98f326a6722726ca8386e90d - -OutputLen = 256 -Secret = 411acf8b2b5d8d8cd8e0c99ccfff9b708b74662e8bc42951c90b45f1815e390d43236a6a80547ec5d0eb7e52187653ea992d88dbbd6dc71c849a26a2652b9940 -Salt = 261fbe146966d70250ac332e16904d0980a9f0c370ad1ee2a052b67e9b07ef0b8900219b8a2aee112fc427b83cf3d69a27d510 -Output = ef10b6e4c761d7eed8cfb9362049fef98cee65abb04db849e7241e1f080e027631fc9f1d2f37063a528a9a06422f1b59a1cac4548b231f6518c43bde99e1b4bc39589170d51315152e0d74a8b192bf5547f4f34c8e908af9c9f0af618d540521a55c922a65c83359501357330abe3bf58cabb670deca679d6c5dfe0bee25a6a0f428ef45a0441c6aca40d93ac036995df53a856464fc98c79ab78c817fcb73ab2f5e6a3be822aaf2290d8dcbe9e8132fede31defdcbb248f57b94fdcc78ef524b5477de6879df942805f9609ffd5ddcf19b86457774c092e28c7ad9c66e0dac6b393f277495e1d2d6e2aab9517d48d5580e464fccb8da3fc8f8d451859f49a8d - -OutputLen = 256 -Secret = 0116f260aa0104f75064d5a857d7c4360efc9591095e1b8b6d86e864052e650d3dba966a0e01bc6f075b7d5322517b236b4183244d356421fd084ac1f69dfb26 -Salt = 0a9637598a5df107dd7c406829208d488c209c17228d1201d16b3bd57be93ef35c9a5e519309f38d74cdf12dad6b679836390f -Output = b5fe112236811ca89d7570b9baa1241ef73cb548f54708e7a3562da8db631a993b300151cf1c6dd7c1cf1a25188a31d09e6cceaac63521f5a979395c41c184740937e1357a0dc593d17d78c5ab02f95d6333671e54928f6919038cb87da621960a2c242c7108bea7906701b841862a70dbfc66e657c410137838314466f3fc03a7487e37ee9f4444c8b8e262671097799969c15a49c992c4f5ca6ab788b67fe77dc5db2a74a2b0c6ff5afb218073926abafa5537bd14bf1096d767b084e269a5561bf0343273deff74746ffd0150f097a43aa83cfef061db4ebcd5a2beb150f91d94c06cba06fc6d473985f5b37f93a26a24fda2ebd4d567e86bf3bb353f92fa - -OutputLen = 256 -Secret = df84b7ce2967112b7395fc042fde508667024f6221fe7acb37eb04ee52412519f42a2886dce04b52fe82df80d81f940b2bbdddc8c6f763688520bad0b336dfdf -Salt = ea485c8331232ad0cf0b5797c50e8cea8826dd1bc3d213304fca4b8f57ebd8af3030c594f0a5c6d7de1888c0bb1f0ef90fd935 -Output = 87066732f2601e14bec184f7c967a9aeb58fcf287c908e597e241580968612793a748febb143dabc1d62b44a5ec8c77baf3cff1c6fb2c69eadcc80afc6e9e9c8e4c240674e6198eca6b3f5f5a57ba5759ec1f2c8c52121f96707d7e178b3938f547dbdd2a4626ee1fd50db4d64dc6d55863d1e3174bed7eec0bf1b3a881cbdeea1fd58a28d8576d4246c928158b14237cb3bae9d86b2bd6e25cd0aaa7eb7000f9a8e3ba5231973d77c75417db93457ac724551e6ede14cdcc73c2d818d7f5bc4bd63232ed9dbca6571cd96c8fb477505e598d0ca0bfee1ebb87e96912fd4373446ac97801cc485850e69086494db1e65ff6de29787d7c0220c15f6a14125e6ec - -OutputLen = 256 -Secret = 42ea986264fd3363858cc522d7ef48f5ddcd3ec6e0a43b27816051efc3cbbb181ff1cdf9cc47b686e576fc5cabcfee30d7ed1518f0ba27fe4fbb5a14291d54df -Salt = 82e08ca25efdf2fa9bac3e80aa9c534daa52ea02c10aec04560eb3dac5e7a88391d3000b8bf961fac7bf7d0ae3fa737d88113a -Output = 6941df403f0739aec6132ad100f3035ac6d9e370b251d107406a7e2d77af7e4c29aec096fe1fef50bd4d584be9c329547ae76d4d6d89554b842cbf2471149dcea38e949031e2d7c7f972d99e04004cb876f534caa9bec6fb6765a1c1e2633a58fa85e06a4af21a4c1e5ed594e4eab670a2b93c7acb1aaf49711cab84f4a63b70e4264fbb316e9b26ad77c0f6f112b0c378e3ae2ae0d080ab73580106748020cfd15b40ed9ec53bd70eeac3288b107b8ed1aaa3cf7b795a7411e1e082ff9c131c1faed305be9a20a92052340df5c93799eee46e19f0888b006ac05379f83080bfdd0d1718b67b489f8f7d0b8d9d38af56e713b9918f4f0934088d2bc43e1fcaea - -OutputLen = 256 -Secret = 8a168548cd72dc9f9516fa3f7c056d026de798cf5c089ae955b9c5e01770b63112d31ff0286f681d50549653a814027d10edaacd964682c4778837a09f2da3bf -Salt = d01807253e1e68c1015c346ad8191817c175b76e2cf64552ba90694f0ee95c7ccb50e40b521fa271ca2f275791fecceef123f8 -Output = 7fac20bbbe3877475038caafc08446c7448f107dae8088588b3d53681c9e2a166cd7829d998702cf05ce7b8591c8c52c9a78fa7e0b42f8af9d20e38af95bfd9feeeec9d9d5ed7103c149bbd39c66246774f0f203266028557b5258fae7b4a2f746621d238bd4a936fb3ec7fdadbe6362cf243b0278701640c4cb93766ba1172ef82f47049dd97494eac07d6c9d4f57f5778888815377011df383f5c8d4cbaf84da6e9f5d3f4ed93df4c909bef80ea85cf0b4e7559cf993131dee622cf1a2b4ddaaf06ce1d68d37318e00f58a98a507f21660e5818848ad5bad75752f8b3caa1d3f6b735c110676c89f9b40d487c220f0f4f0393303289663c0ab0ff5fccb0725 - -OutputLen = 256 -Secret = c632567f5491dad2ac524d78e73a0a5acd2626f5a1eda84620725ea52fffc989b394aaff6436c5e7d2152ed2fa476afbcc1a86b7b78829049c81180d7146ceaa -Salt = f4c5d78a77d0485d0fd192cb2ec4a7edf20b534fcc65390eaf0ce5ae7bd301fc5d74786846f2d9091e480e07129ac61c97a06d -Output = 5b12638b3bad987751438d6dc63854e7329aec1fb0a722fff1548c01970fe72c6b30e4186af4785671b49179e152eea56af8faed345ce873ae6c999ed90e557a519853175d4e538443ba3c497088548ece66002b900711ebb96bf0c276cae4f330e8b1e7b358958364faf8854b48adb4d09c47d0f8e34d993f9fbf0d58c613a68ea25cd6ab8b6eba7bd8465b4eae7f105cbcf6a8b1e48db94e12e51d90d2224a3ecebf9430a541819c7dc700c3de730000221d5c97f04334430505b4b6fd478cd4419ec480328fc374a89e6c5cfed8475d4345c508464d695068ef4828de96dee0eb11d1b3fa09cd128eff9ed73e846e96da0daca440f6ba886cf105ffdc5e0f - -OutputLen = 256 -Secret = 1f2f24e4254ce58943087620d1caad1b71a4547b84170bccdc78d666b73e33b2b02a9e491ad1f565a3ccf63f8074631953ca2e653c89eef7bc78a4c7debfb604 -Salt = 01e881b16d2e4c95314c1ad2c3bd52e234473019aa4a10379b390ac9995be28aaf8e9a8388e17e3d32831e31fac72e6738c72d -Output = a0f40de8cbf5046b32746aaaacea1f0c27996b5f682d0fb75fb147eb8143ea61f51419df31f9e5adfe3e9174aee5736b4ffc116d52607127a6605c976d8116c4f9a7a4258fe9f8fe5a5f228c3f925286585d59b326898da52512ede320c88163ac7fd0df50862fdcf5f139d03769839f7d9bc7a90f41d911e7c06675748b75ac875e805d82f04519e7da02356ecad93491e1c180c96507c36daa3eae53e64f206e5b60d97a87d57cda52cc25bfdecc6f1f0bcd1e83cfb28104512e47a83fbef7ce2cb4405a8ad9af4097997bb6ec6ee53e7782029c90a60476e1b00b19156ee4df633befff794d4f69f0508ff1c9af0de77083be409e2dbfa914573a07b61218 - -OutputLen = 256 -Secret = a07e327e322c27abeb6bd9b46720a0d64740c4c309c8a778f9a8cc2cf0b0a425e0206b6035ae9c98b8761b187be6b9c7e952bc0e70feeba3e332bd3d75e0109e -Salt = c058288d66473f42f15f9c9d5dd0b37680ab55bb966ada8644de5fa4333f93806ee29fa30bb91af39b70bd66aeb7cb376fe8c0 -Output = a00938eef0f85655931553bbd9bf7d45d8540ca05c1e1eab7c7d8999608ff9c25ef0c1fc20fcc3b1750ecd7a446d64afd2dec84d98b596e93fa76f7a80951ebfbc69f6e24f8b51b9f9b28cf9bc56d849705f4ec30d5cb7a51c87a413ec063646177d83275bed3d3bb24da067127361e8a11b77a2215d64c7d908dc67a311f10d6b08eea830ff0e0ab4139a8f7285308100bee3092e79dfdf2102d8eea561c8c9a3c711a87294e4ae6bca5297786cc0e5db73da3ccb7706018faa43100e1a4975b66f2c239fa0e54db1ec51904731336f8567ddd046a98f1df2a5c2382a516ca51597426538831ad92101301c6fa004fc9369787ace80adcd97e6067ceb327179 - -OutputLen = 256 -Secret = bffd73e2a29050e9a90fb1aab313bd4dba18035d70906866206317444dde8e2fd36a852a710a25911912a9145c49a6839a7906eddb5419f7a5776d57508df30c -Salt = f16a194d985340ff6db5ab235da2f158436b3c4d0a35b0990d6826d8b4603e6cfe76444cc294b17e096389d8453ce5f960680e -Output = fc7946eb75ea40d30f5d50243790db7a082a7857e0e9f06b264f9986b24f0cc3e74ddc652738699b4c7b6207db4d8ab5d35ef328eb9b0971328456625c900a54494daefaecaf5b9859ce3019d049f640ff6d1b154e79e5a957d0eb70061b1b1174e2cf36d4229a8ba93b0ecaa020f9f58ff508960457ee40b088f8045efa66f8d25aa646b1a773d1c96dad2f6921edfd0342de56a8034d8fd61753d97edc19f4d4116846b23c0eae06b7d1fee416d4de360daf6a6aabe50cb03c3073178414b779b26e8cc3d4f3eb8d169c3060b932f3181cbec478cc0cf7814e349d051063767b99da97da474efeb1bd30ab5eb9a243e8de2bd21fe4ff56d9203ed759b56e38 - -OutputLen = 256 -Secret = 40359d3baa9e30de0ca8cd6146d6baf1a641f81239d0ad16be1a4600cd8fa3b36a645aee3b62edf7175300dcdabf283a24be1e42aa9ff9c2458762f5e9cafc3d -Salt = 9cd3005feb1de108ca75861dd267abb6a7246c6baf011fa08cf1829b88b52f466bf1a75911ef8bbd9575e4cfe4c9a950d1be51 -Output = a64bf39e518807aa4bead74a764a5e0e7d2afe38274cbab87da6a64e10552fc9ef37acce7ff7e4bc572302ecdd52ee663ed4fe61f9222fde1a3b8b5138f8f5401e2dd01e68db11d6477d4a13b53d10d7b2f12b16010d552fbb12d0ce9418cb585471c445f1d5758d543256a7160115497b64108e23e359e03fa82a164f969767badfb8258f95208831a274b589ecdb0cd86218159ffbefe459551b4dff7ca90dbbe370054627e71cc99844fd02eddebf494c2891d1c5d5baf2b13070ad8fd899e41c0c0e2301fb9cd2ec6575057d4eeecb0acdb3e20e778e197c77730622c05bb94206d3c5cb60b916f194ec90e0ba5fbed2331bcd612db7c742563750129acb - -OutputLen = 70 -Secret = 063251570e7bc2538eea97c0e727cce2e1b6d71f04be69f61ca702080aeef0f168a5411a41f4ed1710b151857263442ceea288da62786acb5033a569e608efcd -Salt = 836442aa1ce00cbda95b0722245e7b67d1762a93b536297ed8fb1150417487981597c1c0c0432572ccaf6f33f41f0979d637ae -Output = 2860f71e558a8fee9f6f25fb6049b7b5a7f2bb4ecf655a9dbc13e12b4aa194556243b7d635ccab02e7c269fe32049cce4fe29ced3dc747a2aee3813bcff2d28274c65fc9e791 - -OutputLen = 70 -Secret = 96512b2a90f53b542d9d28655f03c64ac5164d4285d0aca8603fe958f6eec0db8a0eeb0d9dd54d6296d7e4bcf5a1458f241b137fa671e316faf5ed65f1fe25ec -Salt = ce8255b0fdef147035e8b7b394d1d04570452f1df29526c5fdb0f3e4ba2d21b0733dbf99400b94f10caa651e4f5f0f4ea6d95b -Output = 6599efd491a00d501c027e9bc385fe05d10bcaf438e417bbb3943175e1ae223b1b8819e01f5dcc7f5fe3ce2635850a7747189600a0d3afe13fa7d11cb25c25b909fde9d43352 - -OutputLen = 70 -Secret = c34c80503df9e61bd2edcaae38d7c95c712d934cfeb545cc933561d38abec59e703f88891d4fdb3a879c9a6359d3131be2a0085eee8bfe72d9f0f8877d2d9f79 -Salt = ab959cf9bae8cab8393d63fafe3fd469e836cf79dcc4e33538931af62d3baf32e0c1ff7397295a07159d5ae38ad80814ae33b9 -Output = adc66aa0beb40a5cc521749b7fcfccc2cbde532cf8c15245ad4f686dd520cb38935cc8ffe2f5fef5555d01c54bb909e828f30a271aabab6b3d40d433cb67d44e8d0cfba1ef64 - -OutputLen = 70 -Secret = 7b85bef29bc6c0e349aac8a4cfe48911a114230b9e9cb4ed0ebd597c4cb9ff663b1b1abd6d9ca11c075c24bc9bb999899a6d49e16ac35bf4e317212c9e650f17 -Salt = 56c71f85d8518a6daf22f93e1b6f37fab374be1479c0255b487b3438deb65c39cab966871e81344eb872ec22c12868c3dac009 -Output = 0f8877f55325b5e6a6af7ccc4176bfbae5cbaf13f455ada260a1a296cc8eecf05fde520bd326f4d52a26413a2e20f39d3150b9ff49d3d900426ef4e16da72b5e07a6c78ec6c4 - -OutputLen = 70 -Secret = b95f96366ee3233eb63320e3ab0e3733ce1c4be32e47cc82becccee7bc9e8e5cd0bb3af359cfb0ae7bbe3dcf55ac28f6bd4e053e61e9c9be7765efa7ed339932 -Salt = d7207213757ae6f2cb0886af4fdd22d2d76b05a5f5c61d126bfde11a5d7bfdf8bdb441c4dc7fa8fab89ec15b81dfe263f57b88 -Output = 4752b93b137e9452b98ffda0f4b0013dfd661a4cb127d6bc952ac271c56ae6be9ff7a10c5ad530af54645356ae4503dd2171623a702c9cf50f5f75c547834305492f317ad08d - -OutputLen = 70 -Secret = 88453bf58fbc6b6c07ddbbd179935db4b0a3af396c398f9349d928b0de37674ad72801c6122d00c968f4ed72be74bc1ac0a5b2cf41054f7eb3774ee39fdb061d -Salt = 07b630c1cb72353ee24c92682267467dc22ef15cf8cf6add27a4ddce8852919e952798dd533787fec57c919ee8ddfed9119bdc -Output = 3d9e59a17a6f0a5553467c9e8afd35176f8d5714c897322443c435f286c14d0e149438b6bce749bd05fb9a30111fe7063fb523befffad30457079d4d1ac92211bd576b2aacb8 - -OutputLen = 70 -Secret = 537ddca36b9ac20fa0a202504a7436c0bf8ff6f866f6b355a1296b2839512f2fe8bb27acdfda2e0e2cfe24d8666660b1f54e50ec78738b46a888655bfa6fe933 -Salt = 060a135164a3cb52933cd485e9b365df0f119750a20faab280369bee602cba8975ebcd3975d37c6621d5e514d2e3028ca6fc0b -Output = 698d7e6c92e3b427646622afbd694a7c5c211077786c7d3820c515bd8326b8e30d47f673bd559b72a274c1c933367b01a3ab8061d8e18e0bb40c28827ee4e53ba81d426c830a - -OutputLen = 70 -Secret = 6f2800a340163c90d5c3c5153612a9ca20a4a18b1557a9a74fb09156cb0561a12fb7f6aaa23b6a231da2b665e4968354b77edc48187c8f549c04865338eaed4e -Salt = 6d819e595611f7461472131e8fd270c6d1976f7eba8ed36a9f1a841ca2a824c80c1ce29aee7cea6f2294616238b5f504d22b28 -Output = 37c26f2c566af08f7a7f55873694168a039281c73ed51521f331bcfe85d1e953673a0ce3ea0f67cb7548f7402289e2587f1a0a5b214e7c85423191c1c1f7d17a213bb0dce975 - -OutputLen = 70 -Secret = 74259daf5a3a45dcae7151c0c456ce95b4fb8aa9d22c23f165d25d8a9c2b0395c3f8f3d5d34fcd5f3e87970a7eaec0d00d1a507798b74fa22d12aef3bfaad45d -Salt = fc97ae7d40668f60bb23ea96fa4e3e0c4260fe13b27eacd26bf364b090126261b2b9a41138918426ebec972fd8877dde6ea9d5 -Output = cb40098686e4de55f2b5d2391c9732cbfa40d05f8e2d789a97e4fd49161ebc3d52269d47e41ab520307e85bf540f383a878939f0c390b93c6e432e84b9ea11db3f7c808746bd - -OutputLen = 70 -Secret = 17ac041b3d77727b95a4e933b51d23028f5eef36bd6a8b575fe0940bfaf6cefdede6adb91d177c446a5674e3a90cfaca43c0fa90bc675a867b6c6918c4a8b701 -Salt = 47faa783bec8cd13f40a6b4d0461f2d7c607586e00870e8579210e99e2c2c9d94676e628bcf89094536234a0b05f4bafa750ab -Output = 4e444645cfc33509049a04fe8c19123524b4bed485f83fb7b46ca17872217f657c84c7856799e2b539d711de987f74c90fdf870da26dd9760739ed9ac52dbfeb7c07ce1c5c79 - -OutputLen = 200 -Secret = 1784e725e98f635383b6e850d48e99bbde76e76a1b089d1f3303403d99d775466be47d19399054490439160a353fb6873a9ad2b6a861aafab02b40cb7c59e260 -Salt = cc188d6bf6e8dccaafac86fbfc1f07aa52a907b14be854692de782681387b14b3854e7f8b9ba12e33b2c888b061a6801ca08fa -Output = b0be58ca29fb91dc556f8b57a5a847cb332b4bfc12c4f165352a16e008767873cd4ee5ba66565283da3d3aa8d30dcaac020db6c425312e9e28788c037fcfe8e5b6e8baba9a77d07c0d20439527940410ad4ac095835db197c0009a83b0575a6cf717436c65d700e55d3b6e5a77a39cdff20b9a1699a6eaba6f33f12c32a7a0d0ffc1533f6a3a1e73481b9a900c0e55352307bddd4950dad71ec5c7162b2e196a1cb33233f9a5dba5c13c17c63fb9821b1ffc860bc8cdea561ed3cf39939f97a3ffdfe489004247d4 - -OutputLen = 200 -Secret = 2e37165bb33ce3dcc96cd6d8e3ecc4f9934578dcb9ba45015fb62957877e7abb09d2f5e1172a2661eaabf28cae80ca1f4f6e70722acc9bf6a5ec0c989d2e1d84 -Salt = 733d6d7db196f0f626fb20ae65f5c1f9ea840c1ded38eee84d8f8251ecd79f8ba7a5567f888a137fa27c20230d799a0b8faaeb -Output = b72820a0e02dd8b91feb117f4a04442ce3e68505d6539c59a573131349af31e7955f8dd0e00041596f5f506a67045122e8828b7c5241a31d931567363cbf9bfc1c9e1ceb10f658231790cef4b86db78e3f83ac9e9b2e385b8c0c1aebc56e4351e52d8b9d683e41da8c244b5045f433932300b7dd8ea78e9ff1d15bc12ecf43e94a8c868bcf0e1be6b975899e78a3d6bd9358c089e5a8db449843b3d55ea700d391c88330fd0a5664228e9e85e1c0c0a7785f041ba20652f2fae720d203743e31099916fae98da13a - -OutputLen = 200 -Secret = 4741d8cabf06eaac7ed258cf8e3b4b4974be29c927c806d4649562c39aa514a5392edcc4f885fe026729d740be0d2ef5f1643002e1d06237aeb72d0cd8691915 -Salt = 13ed00d950205857df30b1e4604ddcbbf557600c639d05fe97de66b3b30717848f054e278c704983fd7ec60c8a48b7fb4f3d2b -Output = ad916e33e31571e3b62045ca61f2a1ce5a26a5b017308ead35faaade350f70e0e683cb7345b88e7ea665101f387d6cfa5ed509b308031261626a5c5128ebb88ca9cd4ab1db73ce29c45a0865921bbc8e73e0613286d08f1cf9fb74df4b664aa11b0876e4d5dbfab7c333cc33cc8b5adbb2216a95051cd8d40a2a59cf2d908da800619cde58e3dd272640344a7692f3708e29f6ff1cd2750dc3c0c0e0d51e03e9edf2f23071c2dec2d780a1fff76948dc2ad8d5055a914324992ebcee214705853f4e3f494cba6461 - -OutputLen = 200 -Secret = 5ba0d7bbc34fa1c9fb098e7d118f4eb3c81a4f3972768ddfcfe3ada7f53f96bc43e5a2c5df03ee18ca46418769fecd97b9674284811d287cffe879936b40b3a7 -Salt = f29d362305816502e983d2426fb4c94f7e2a6eabb93adbfc50ab87b45af8458fe61923c1675b34760b289908f1012ef602d0b7 -Output = 8daefb5f08e4c44800b30631ec05221d2cefeda1a7148066038ca05a3f754a0bde4024720dc268c81295d0397de87cda1351b628352540326e6c8e36bed55b0e0d0d3c3e2ae1ebcf46d403cef576afbbcffeb0a3c0ff09eec39f3502e60bc8380815ec2b9e7b912a111304e063ee8b6dd124e4902fef4ed8c859d612713ddd8228cd5d6aadf360a9eddcab9131b784344bf5bdebb39540524c737d9a8475f05321f020079dbb4400e2ed199fddd11bac6890b5b1fcda569ce1c301a1796cb006a0a3fe78d8624533 - -OutputLen = 200 -Secret = eecef39a6f794f88d726212584ace92255a2070a8b85020dc9320162bc8ae3e9918829ef6e454b1efae66af424cb92227e7139b0235c6962ca6b17d3349bdf8a -Salt = 5d524ddcc2417c6fa73fa8c2e6406c6794ebbc328939447b9809de78281d391544d2b84b3c921512a92e55d324bd3b958fbcf9 -Output = 64dbc73c5a72fa802231fb81b3b712c6324aff8432e4a4f13006490f6a638459978ed601f654e1ed9582bf9ac1e96f60b6456a18309fbe4b34889803a2e9370971a48d13a2fade826c91ddee0cc1a60c82936a7803a90194c45ea1bb47a2215654c3d910dc8debcbc342580e0dd7e8193eb2dbe84e98e8c5a86b40bc29b11f294ddae9cbe16dc2ec70fde13e25e48045f696bbd40fc75a86d527a13c83d33a7a1dd0e61ea39ed112bf660e16b6676cb51e14aad4800c790cf09cf28f4bf6a685c9985f061b991df6 - -OutputLen = 200 -Secret = c3ec1379d13a9cebb9775eabc4d42af2047a220aa29ea10772cf2194dba0c1ffba6948b68485ee777bbadc9a021951ac0f1c6250a21733f7c656a73e07830655 -Salt = c0f22ae37db9c2b501482dca46b3aa49d23fe55ba429ae524afa3f4a1b37c6ee0cf0bbfe7706cde7572a5dfb07a6e7ac4acdb7 -Output = de2ab3d673d0d226c234b9f268311d5435bae59db1c299f03aab575e366ff9a329bb818079286b54ff8ac94158c1f30dd0b3d7a6ba249748e48c8bcf7c7cfbb44c1f6e170e48a4067b0dcfdbd9dacf946aea5aed33ac06488ce05a9af5da593759b398cfa5edd080a0acd9dcfa3f50116ce849c4160062d32786723858708fbcde81943de0fffeb70e6d527dae3eea6a1b889b9c90ef8d167fcb6f03a3affc6c1331edf0ac0a51c3fd9fa9a31a9c97b0ad538ad09564615e1f745e807e105ca492b22d815cc4927a - -OutputLen = 200 -Secret = 51e06da1fbff7f7005819557e119a624a28938b2b5375f7d27d65da50a68ee16c8c52f354227b2f042d32f20d0622ebe8bb369414ef585b528ce7bf2964e2247 -Salt = 7a4f51a19aedc20c4d8f995a4612f46a6f171b5ad0efe17c69640cced6f77ff8e3f1a9f56b7e5d0aa6db6dbea2f4e664254f34 -Output = 079aebaa1b327b58f9def2425959829e1a599295a6e97018484557480a2de607bb214b1ce5083dc233ce51aabe1b9acf166dbda9a4364e5557e6e11ed9f43a2e98747a94e730323e2ab820ea76d53c2b07294392a10c5f4d1fab9e22506ba61b541582881694304772f6f2b115b6f36d3134b6ee2801366ef23c66587b6a455d13b077dd1363a1374c72a7b5e1f7b251bb461187ceb91bb6cb49b5481315f655d3a6f17a3eff19810a3f7e6a62d398b6a1efbbccc272464da6c2bb00fae27c0eb4e79d16a4da6147 - -OutputLen = 200 -Secret = 4b1f17d388562f70d89943a3877022897065b1bf05f0bab071d65c3d615a8df79ef029ff07767bcff16fb7dc60fb8c698c6fa20461cf81bfb01f2deca2cfeb27 -Salt = 0a0c39da85e336d93153bc1b2844e2d6750ae50bb8ad194ab79054b63c972f2c0dc139dc005ed1c60ce542af128e382af0bdcd -Output = d0553257f05e99e5b7ca7bbd502697a54a6578b95146c2be7bcdbd2a69d8eb4c70eab055f4c0959cb00a59a31d86755e482d4ec5d1df61a707c59c3973727a39f920001a87c04770e796b62df9597b1cedb5a4dfdf502bb3fe73564d2e755205dc93862a8fff023b25fcb3f5a0190f5aa7f78dec57d2615769811ea8160f3b32d604e9eb37353b82704c177261a957c9a664ba53abfd1a6796329cf867e4be3c24df954c0667f0267c122c4d15d30417e8aa58d75ac268e7537a826e3c831355a45e6a4ea1a6bbc9 - -OutputLen = 200 -Secret = 3fd1668b6927be2132595173b7ea0e6299514fcb30e14ff859909811ddc40b1cb80ffaafcc8ffbf9f2cf073500887fe327533f029b32fe4f6adbb367fd43d2aa -Salt = efe20f2c3521776266d42da304b3a92e7dda0c310db85390ccf08a887a2588af8a7b8e6b69cb3fd43024c71d925dd96631fe53 -Output = b8d7c8554e203fcc29b1ec6727f59f7a4cb57dc34e16b66e705c73c21faa64ab5f1e3190a7d5c7abc6f6a29364208bc10d1dcfcae93b9e1d38e9f653a206a1f31442f4bb36909a91e7076a7ad846f34a271445458ad0cbe314e3d7ccc9ce2c492b070468ecda254e7c20e270a62ef66ff28ed009f25be962faf236abbef0ba2ee3915c3566d5bdee23747640885412183f38382910d007f52b9a431d94745c80702d8f2391ce483d684441db98b6cf749173cda3324f59ac3c93d0ff7192ff2dd465f5841717585f - -OutputLen = 200 -Secret = 696cb7bf51c40d71788f078a7e78f69ec78ea846c41b18deb1c11007c90642eab55bb101a8dcac5daa02fb6cda2a60a12d254a0dc850776e02124bf05c671fe1 -Salt = ae544f43633050a6b1e7734486198d84cd4418872a82db43591e8fdf90533086763515480a4594831a2f7c157f48bb8f917cb6 -Output = 1bfa51098a1ad1bd1ce3c8cc3c1a749cf88839fc2f295255a400b81d4afe990e49d4b6ba52e4c1cb090a06ac3e7e090e58230c67a779fb376a19375c6e7a3cb331f46d1e5bc841d1a95ac5487bc40902475b928ccc5d6f70f58de92f051f0b7125262cb6d0e0320c4112d1869052694d339fcfc46e623b2c19c9fb3978ada521e2a272012c7ec0b8c50eef9fe64b7a3e923da9ae21b8c2066e4090f7cd0ad10baf2197870292ed9dc57f89009e55a3873cd02f77c46bbdd960a66e534a8a5c6c2a29757b9291f431 diff --git a/src/tests/data/kdf/sp800_56c.vec b/src/tests/data/kdf/sp800_56c.vec index a7c600ae3..a08414b3b 100644 --- a/src/tests/data/kdf/sp800_56c.vec +++ b/src/tests/data/kdf/sp800_56c.vec @@ -1,204 +1,244 @@ [SP800-56C(SHA-1)] -Secret = cd532b7dd6c29cd569fbb2cca825320e88cfe846 -Salt = b2711bf99be3c927f4d5 OutputLen = 2 -Output = 178f +Salt = 97ca00eac481e8b3556a +Secret = 52f4676023946c7307b5e8148d97f312623a6e88 +Label = ae8cf2e46773a68098ea53b3 +Output = 1bcd -Secret = e9d9bf8901e3b52d9ae6d67a83fab0e7c32b1736 -Salt = 760a6bf7f157a302f6be1519355aa556a4c51ee6 OutputLen = 4 -Output = 3be7a08b +Salt = 76b026053771b88e4e833962a10083835a33ddd9 +Secret = eecb51e6d59a6fe688fb591799891d9211745a13 +Label = f2d44c1b59d725ad7c662ca6 +Output = bc3d9b22 -Secret = 1899180fdeb17155eea6e880383ea5fbc45a77c4 -Salt = a8da679658652b973a4b3eac627ab3e166365360409470dbdbf101a6105d OutputLen = 6 -Output = 835d8ed2be16 +Salt = c1f81098a72662b327c78876fc0b75dea3944f0fc21b781f924644c93f3f +Secret = 9f5a5f8780a998175b43539cf8bf03ac78db0a7b +Label = a969b5e72533bd926be139fe +Output = cdfbc6b3d125 -Secret = bd8de9c45df5a69397ea4b03a06386acb477a0d2 -Salt = 88fc471da441ee15235eb9e63adde5f6868cfcb330b7a29704caaa61e1e2c11bd9e6179b274744b7 OutputLen = 8 -Output = 1b9b486a721fefa6 +Salt = 9a8667d4331ad7826fc10de97a680feae1635e193214d364902b87eb75123038c37599a32a5b65f1 +Secret = 06a4e7b9dd40cd8241a8928c8524680d97bc1222 +Label = 3b3ed9481e314f42e74e6fa7 +Output = 763b0dfc2c369e0e -Secret = f9a182236f1f50bbf80460783f534a4e1f3939a2 -Salt = 97a82b49e2b42451a8e860258cb77043ec401e4ffe0551a16a8975b0adc26618470e367f09856b16781a0c907a64540cf7e4 OutputLen = 10 -Output = fe94330d4e7bfc57eba8 +Salt = 2a9408e98340bfc45567e4940c45f1a95f741ddc222676020610322aeb50c612649a67914f8967b85af0c1838406a0f61dea +Secret = e91256557650671447c551229bb42463d90f950f +Label = 69c1bd3aeb3c2f8ee5f24ae5 +Output = 3e3468dea8892883f2f9 -Secret = d9af8ae816a53f5b9faaa10fc75ec7c55e613e9b -Salt = 85ac803ec1415451ab6127a6286cf97ac27a0b11dfd203a3c8d0bdf6aced44e5abdcdc4d3363899aa64064b92d4a6cad266fdbcd9b41d5cf2b4a1422 OutputLen = 12 -Output = 7f0c1b9fe8aab7c401ae8db9 +Salt = 3da95b5ee8985ff7f14028da429d985d3de14ff23bfb29f852dfb50b18db9df3078a1b8abaf2caa2aeea8bb479494e7a6b3bd2473e24b0d6d700320b +Secret = e8fcbcfab9277ea4ab53387e83b8e5dde6f8021c +Label = 54945740bf97829fee4c8b50 +Output = 2933ee2413da986b7657be5b -Secret = 394e7c7e91aec4911fe1268406744314ff33e3df -Salt = a0c605019b58413aabe2e90a8499f934d8d8b64154b3f9bb941bccbdd9ac471d474d5ef5ce1c4a5af53a8efbc8551aed2aa7cb492aa549985bd774b5e4bfff994537c92b0cc0 OutputLen = 14 -Output = b51feeba2aa9708aa38663c13943 +Salt = e095dcc7123adef68dbfd6c7c29ac9c80e0df092398fda628942632e468fe908e92e9260badcb9d261f64ed5d5a1c3628c601e1c4d7a0f242a4c8009980c79e865476042ff56 +Secret = 0bb6bf4819f22d9f6f96887ebb9095c31ccc32ce +Label = 63136125e85a113da864061e +Output = 97c38fe515a28acddb2cfbcee034 -Secret = 36cd701ef92d16912d4ace3bbaa047cc86456fff -Salt = 9670ade69fbdeb1e2912fb7d5a93ec3803b4d4c5349994e9273ce96dff4871b214d27ac66f13970823706729845707baeeee36e25afb193be31f110f5fe8e311369c2631c6ff917df493306c18be677d OutputLen = 16 -Output = 1a047667371b9b26e4ccc6b1207511ac +Salt = 2cc21b527b4a074f267875af9519699334347c8d15ed3d14aa921aea77c6c06163e689354a7988b795ef5296b9ff99c6e75e41d338e20b377cae08bdfe7920ff83c9834f02e671970c25d171f5c3c8dc +Secret = a316ebe289aebf5745e416e6b1a189e55751fd24 +Label = a993b8c4c2f70eb5ed02cf80 +Output = 5f59752d2f2c4399ffe864949a208a06 -Secret = a3bab5642285491532d60020a98302f02ed7a472 -Salt = 192413e8d2de41aa5d0d123ddebf2d6d7a5d04a40d0bb98ac53509ae74d818cc8575db7236361321651beac5165caf2ddd896189bbfbbed1ed9b017b35122b47446379ee911b4dd7d5f1a3cc8ce43586eb3bfa6046680185a24a OutputLen = 18 -Output = cd6d3d73f8f1f41cf30eedce4dc763ffcdfe +Salt = 4bc4b91ee2f0e11bb3456cde97a5c5a6feca16a278d3a296a4e16a6980af15594307f53f52d8c98d47651e85256f098540af2a9c4568e369d836d11574d31287f71a03b9afbce86aa9629b822d46ef7825578b4d9e78f0de2e64 +Secret = 40ae2aa2ebe5b276ad8f786e74d94dadcbd680f2 +Label = 4d7eaca4362cd635c8813929 +Output = a6dd6c1076c7943d98fc4b29fae13f4e6c63 -Secret = 77062c72bdb65dc516a78bb8a27ee02667d0ddd6 -Salt = 27d1594a97bbb83a2bf761d5f8e74f43cf6aba6437740bdfd69912d9c587331c5e9f96765610be2072088fb6e8fcccc16c2bae251351da3c9cedcd0d5b5a87a6b716f64414c19c55248ea0d2f8b7f91e57a089e5a9b5c6879ca50c1a78866446434a5c4d OutputLen = 20 -Output = f9c3de140a96fa1c3e0b670f776483edd090fbd5 +Salt = 309140e642573e982ac8d13338a2963dd82a7232fd52887224f6b4d26085c9c7d3953c7af72a745bba93c536c26671f630449d3813cbd6f2c86e937ddcde5f2f43a6375135800acb846b52639b091392a95fe4d406121dce369707d5ef9376053fb7e32d +Secret = 9b4a2d72afa39d598f81cb22f1b3edc7d1f91f68 +Label = 6bc3cf66b452ca7dae045555 +Output = 73ae9581548285698d00a391ac5eb301004eab1d [SP800-56C(SHA-256)] -Secret = d4548a239945e6e9f9bd69628ceb0e23a34bdb8699e66066a2181285dd8d34c2 -Salt = 772439b7470abfc6263a OutputLen = 3 -Output = cde29c +Salt = 28e12e410d501368b3e8 +Secret = b3dad1f46a18430ea0c8fbe2172922a5a42c47af40046db24d38cb11eff4ce44 +Label = 94d91d500177efafdc93e8b6 +Output = d4c1fb -Secret = 5e371d2884b1946865a33963ef7261d222d326db7b7a62fcbfef7909d97f8d1b -Salt = 1b662b466e57ee529dac1b902cc961075321def3 OutputLen = 6 -Output = b7985578382b +Salt = 83cb6e89742ee6a02484807b601bff18c4541a58 +Secret = 34503f1c4f68b0b1a77aa5ee7b3033d1931d3791e3807a440e2f8f2d53c758ca +Label = d9317c91c613784c058217ac +Output = 68f792ca2f07 -Secret = 9f720b6839d2355689c07502f28b2d28468a733786209ed5e2d9e23e0731fb00 -Salt = 8b1a3e24382a5528814cf6b9021846db947613b8c548c13644f821a4b487 OutputLen = 9 -Output = f604063bd3d0b63a6a +Salt = 075589bc8edadc44f5a8e2225dd5b96fda92b0cb990e18c1b4268bcf5a3a +Secret = cf37bbd4b781a1ede2326547a943642d4719a28053eb118fd63bb7a7da423de0 +Label = c30f26e9d9c6f2493642445e +Output = 7346edbbf155646db2 -Secret = d0c078b96abab2f1f780768f08cebc8902f9dd53b52d387f5c8daeff56df2bbb -Salt = 1c14dcc47b37bcf41ba2f0c5e97fe3dd0d86ca80d95bfaed0d5e80f7f42742c6ad73c63ecd4fda2d OutputLen = 12 -Output = ffaf82b0a622105c13325e6f +Salt = c97bd90493e873101db3226226e1e21d3f8bd95399106da05321a38c5c45033822e156768fe26fa9 +Secret = b550b9390efb03f2450df54113a1344be2d45770074ecd727cff21f232f88f07 +Label = 11bed92c366397feee2c9a1f +Output = ab8ef443a9f23bc88e3e2f6e -Secret = 7cf2626bb18d71a4f7ee884c52bec6871f600b1cf33a7b8a7de6f1e29b7c4771 -Salt = 4e97be972fc4eb7dd58fe0e25a0d9376a9b387869edc5ebd4bcfdba67fdd0741a6d8b5cc20801a58ba1f6dd3dcb461f00f1e OutputLen = 15 -Output = c5e54b85af9c8f7588aa67ba8f0858 +Salt = f519968ce019d41ec8846041dd10aded81f87b45da1719fd449f6459135ef2a5eb776d8c137e73871bb02d784f8fb4d921c3 +Secret = ea74d3ec9ea5808644655903056d1ff6451ffe870e3a86d208ba8d45e31b14eb +Label = b70697a769d87e8f47c578df +Output = a1ac9b6228f9271f7067d640b1a3cf -Secret = 40cd90a9e020715815642bf7d553d3aef14e5624860c70ca5accc69bc8f8aa86 -Salt = cc9ebd93469f17f0025eb68c30fb0debb6ae2de4e8dd9e2fbb15f26ed6780f3d10a27c0fec7babec3ad182db425c3b75d405fdc980a371571e99de73 OutputLen = 18 -Output = 1a96a7bf9aa8309c00625292bb30dec64c38 +Salt = 0775d0303110bf187f87bcd9361b7e05970346360cc2d52d0ee00ed01cf92a078cc29e52f95ef2915bcc146a17bffd87b06d43938cef9b9f61c6142b +Secret = 85ac17a66c6d0cc326f7680ebe0ff8655e3f5bfd7ca8898a95745eab521b38f6 +Label = dd85261b531e23a05744b554 +Output = 116d72bcf5a31542bf24898ea3663f211a7b -Secret = e56c45a44d4fa0d49942453734a17b4a132a662924af9e61f6872dd7163c3099 -Salt = 2bf27f3c31cd49c10e6607ed573ad98e0c27612c45e386f241d8f0f2e7ddb19b28ff58f8e9c42bd0f85b6b7edfac2634acd69ef1f6c9b6df42075812dfd16a5f19e2c3f6cb95 OutputLen = 21 -Output = 56808d11787c129a4f7b4a7cb5b2d4e5d20a21a363 +Salt = 966c1f4cebe790a9cbb18ab170e6472eefa25c34cbe1369f1f6715544dfc35e156091a9b3d9f588e0148dfd441a85cfe09a9a799e2a505e8b36d700ce2964213d385c8dac1a4 +Secret = b6c8412dde55865e80e2496f5a76930c9136dfd50d52534c39b29d8c2a19bc70 +Label = 7a744ec5943efb5c99b6b6a8 +Output = 40596e7548b670886760347daae013c416db59e9a0 -Secret = db7f18150490464e9d28b931a7d4b4156a7ee5ced13f498c77ff7b85d3ee774f -Salt = da23e05a065374380b1af9445dec5eddb0bc65ad9c5517dec0ba1baa98e4e3788473336d97d766dcf490eb2c903b8f1cde6367cfde48bff835abc46f1973ac79eb345504be38bc6bd18bf9fe3b212c3b OutputLen = 24 -Output = 76a773f96c956d042676a35299b1536a5770a2b5ac5ed25b +Salt = d6655c220ede13a9778c41ea0edcb662486490d8f4bddd930d0c737362cbcab5ac602117d040e8a7c67e715adaeeb5c6872ef75ceac3bd17f63ff87f5366c36c3ad7f4c8eca695c8423aa528c429bdf7 +Secret = 97fe45438ad4515217cfa63596bf8cbd54386cf7800bd8166809ba37bf8bdb46 +Label = 5a54c7491df248ceb5ce677f +Output = e133ab9ebd72b00378f9fc0d6b434175f6b77d99750b6510 -Secret = 768e5682a325321082caa28545ec343bb4586474bc8b4ee3e6324eeaa81ce3f8 -Salt = 331af845cbbfc9426af1774d24d03fdc76d544c7e2b13f62d0a378096df93416faadc6224e6aab2c0f6c0093f72c2cf41ff12d80a0c9657d3f05efcbf71d5b1a7a560b01ff7af4ee4376ff982c94560a0f22633539fc9db07c95 OutputLen = 27 -Output = 6a12bf4b5819db6b9229a24843d823ac673de6768c80b7456812cc +Salt = 89cf79068274b9c8be72ca089705214cfbcdf21941c2ed731a3c38aadba6bacf514117de08d2867e8b8eb89f614e90745a3e69902418094fd6027136486b30b648f97bb7ad604ef5faeb7e40ecf3f31bacccb9527095d0666638 +Secret = 1555c89ed1cd76bcc7771ce6f04f36258abc24f0a599a975197f36c76270f7b4 +Label = 1b5b4504396890dd15f3c081 +Output = 7113669fc54b8685d810fbda72501297c607d316cd0fd54b3675dc -Secret = 23235f4f16f429bcd3c4c9a79d78d72b13b32502dd6d5a05da46da8619231100 -Salt = 216d9a2097944d8887b359365d4ccd0bbb1ff7c81e0eca00ef3ae191821f6ae9283cacf870f8a160037ba37162f27e375d49ee5348ba2e241b7fb7941420b8af372befbef0d577fc9f0d6e91b701ccefa971c59bd3fbcae0d27a1f93b66ded0e9af87541 OutputLen = 30 -Output = 80be70b234be17c76ba6184fdfebc0b1e3d3c2913186b30cc1f39e3a112b +Salt = 3f8f8242f99f6334bcc536208eda5f16675a05a7c93a15264906511dd5ea3aa52d427a1dc5d3c629d2e7df9e494d83f077c98112c7b952277fcc6a0d207e8d269b8f8b6dd2cc419171d83bc71a7826a9a1421cf2cb6d2562ae0c3273d1ca53c4ba58dd94 +Secret = 1fd2b381110cbedd80b2ddc4ee2f48700303044ab345d48eec3316a20d01b4de +Label = c5d0f9eb31293ba4251f5fdd +Output = fd3b37142521487e97f251d13c31bb01b5714693ca0dbfc1065a7b024a5e [SP800-56C(SHA-384)] -Secret = b7074f2520081d497fa99f39e15ed71a99cae4d49a8024adb39b1e7e8f8e7f77d688bfec4e2a9adf -Salt = 2e3543b1c377b818ae02 OutputLen = 4 -Output = 2383c156 +Salt = 9b9b25cf91a93d3cc618 +Secret = f6070cbd6cf37c42ce50bde749d11a5a3bf3520b2c48b724288d939d8691946f2fee8bf8b3cebaa0 +Label = a156e6dc23125279b172846c +Output = 6c951cac -Secret = 9f0e06c24e8836e8cb68d4e97a30b9ed482e260467427684bcb621e8d422ceb24ddd358762478c68 -Salt = 586b94eaacd30c2d85ec911c5f3ec766e5f4384a OutputLen = 8 -Output = aec4ce4bff52d273 +Salt = 0a21aeed5e089b3156dd8a001caf152ffd6d7620 +Secret = 523a5f2dcf0d36bf3209501b4acda2736c161e688f6d91d44736d070f4e80b92c4b3699998a5175f +Label = 2b5cb3d56a5a7f6d1461c6f2 +Output = 7df3023eaf43b870 -Secret = 378818cab3f81894e386e991bcce3c8049a23c77be9bebb8b97c52102fa4ee305bb6eeae4c087bde -Salt = 6aab5b75a353d9815c9e01e8abca6a79a81f7b5d4eb8c3ae9c4fdee0d38a OutputLen = 12 -Output = 04953a296e23abb8726fd92d +Salt = 4c81cc5d022403fe96c59cb31d35c57b77e108648862416386244616dea3 +Secret = f1f82f22861f8cb9b833d6886e97d26ee7f5893c0c38fd218c6a3802e1af952f82b1ce233a61a3c9 +Label = 394db0ee1c798e87e8b37d3b +Output = c45862cff28982950a8fb591 -Secret = ab1274ad0c1e56abdde2352620b4cd23ee16225bfb4cd98f4b3b1e955ec015cfc76fee435bcf886e -Salt = 2ba15c128b577a9d090efb7cfe0621874020b79b816344cf4358c938a9317e27963f4fd64e88abac OutputLen = 16 -Output = 9d00424eea26431d750f7e1a32756add +Salt = 9afec70b49b802e6faa719b39609e2940fef2c5ee9bac86f4cf58e35e91cfaccdd07427d2a2e4f01 +Secret = 28d5ed9e308fe6953631e2bd8ba8d2f4b86033239a6a8247bcd55e42cf9b408d2fa289ec5482690c +Label = 22b9d57575dcc31d0df658d1 +Output = cac0c4ae9d70789ea6dec63cb290bc96 -Secret = fbe9355ca88b882ce8fc770567e1d84e61c02242aa39f184851abf33b751331199277f5f739de7ab -Salt = 162f378617b2105f0d15d42d7140736aacfaf7e66474f32eb330f1ceb514a6fd1dabd2b79b53976cb2fab0cd0e0d3f067923 OutputLen = 20 -Output = c9732ecb2893a8ff5e04aea9fcb6d64d34703dbf +Salt = 7e9162b80d7f70a91f5c2db209f079cf63c0969a55bbe84c4caf1c6397c515068e307fa0458dd944e6dcb17725a91ae55e6e +Secret = 4e3f4fa2994461d6f1d77f025828fa67f838bbe9597b7b24007e4751579c6d6c288de022f4131d59 +Label = db53aecfc64227e771dc4e8a +Output = 89fc93c05ca30f78ba2f8ca7c21d3b0c25136b66 -Secret = 84a1add0f8aa04205c56293d270e0289ffecc8637c4e455ce16a6b7974058a2f7f5bbc8e9f8ee95a -Salt = 85f1258ba9cdccfa76c503eb839a631aa06878c313d813cffba518c0331160148c212bd3f35572035af333110ffb5e540734865a2b9734fb27972ad6 OutputLen = 24 -Output = 552ea6acafa9c45be5443c6c2ed3aea62106a44b36bfb591 +Salt = 6d7eb49381befb89664bce0bd0f2fd174e9f83a9ecc87e15fe7f91bb83ee906f4ea512f5175feaee422f4a28a620d3e3878625c1097cb72a2676405d +Secret = a638f635e763dff91f3191b4ea69e8eeecdae27537899b0ed3fdc6003cf545663f9dcee12298efd6 +Label = 061ff514534d3814191297e7 +Output = ff71a61e44de535a2e892d235daca2d8724a55ba7cd8a821 -Secret = 8e0c90594392666b105842880c35494bae76018f51514ad7d3649f0f42fed9c0510366618fe0feae -Salt = 599a4ef250908d0b5df2d14fafe76db7dc389ce339958a196cbd183dbbec650e6c2de4bb60edb023836200ce232ed70852933424088658e18b2f6d9024f8ae996ca57b0f8819 OutputLen = 28 -Output = 92b9d148a77c4de1538400f95ac0c8f1d446bc19b247b9a5bd2e46a3 +Salt = fc8d968d2892dea9ec20cc0207912c8d7fe713dfd7e9c9f91b1ca5ce57384b3edf975e6f368244320986ce23b185a1f7abb053c60a1ec8a8f2d94f4baba02c8ce4442b20d16e +Secret = 039e9f561e6a07beb6b0fd7bc23c0fb25e2e62f3173115c7a12c40f1edbccc6403d2ec7def9a592b +Label = 89b1ffd0e309d1767bbce6ce +Output = 3e4bbc50ac69260ce0213ec43f293ab66a9305e16effd17ea525a38f -Secret = 086e47603eb1c55f6babccd4fc7b9dc2aae16e9ab38de1bcb81f8b4859755e649fe2606c58075c6d -Salt = 92e8671ba92ecfdb5d00f1099e84f2d40892b9f4707285e13f316f94740fcb4172ea3983c816ec14b0a59ac653bb1cafa63d934ffe439d9ac146f97e3520b6ef6973ff00ed3370d53d5a29efe8f67bad OutputLen = 32 -Output = 70c223d51e96e857cc23dee813e99e1b0ef9a5eaa8e114d793bab7fba52dafda +Salt = 48471cef158f1761b0427c627057aaa45401e120566769697b7ff42f0ff3da1f1d496c8dd00897d18318e69726c334e1db41caea203e06444ee1a72f774e74ededca2249d5102b6e975b8b47db97e075 +Secret = dfb046303b7fdb36ef8f35f37c6b27fb06debb309715b14518e0dac9414fd8a93d4efd2283dc3fdb +Label = 9e629aaaf56e7a1121ec6965 +Output = c789896cd14a45cc427ec9e7d87121bbc24d38c2df857617af475f62ef9f9ff4 -Secret = b77a941e443ab076aae47110aa463667f80da08991c9a180fc0ddc337c3d1bd054505f792bb41473 -Salt = 587ea6632380a754db9a8bdadae1fdce585c188ef7ed00348aee61530b39db2db8ac770090d0d93c29eab83d85758476c943b7254839837884355ab1907808825d56f96d78a24809a3cd50a80ca2a17681387bd88244c3202345 OutputLen = 36 -Output = 33942863ca9843b3569b42b5f8ba38c4461958bc9961ca7cf2a465abc58d455f95de03e0 +Salt = 0abdbc020bf2c75c8dd32710fafad41bd2ffe2619e9bf67ec2e0b817bb9aee5b4597a9428463a39182f860bfd31f2889896a67e5a63f7ebe9ed49aeeabea34417e47b4c81efb2661c50afa703b3f4df3480394b11ab72609dfa1 +Secret = 95c67352e996c0626b28dedeb80846da6768df0559522630a8350326b698a6b51a0b6d022c50ebc6 +Label = fe80546d5f0019a325ff02a8 +Output = 55e528942098aae048a0fb122323b8daa9efb4abe353c98d66013d34907d68cfe5a543fd -Secret = 0a87b8b41f1fc47e68261c96c157ce903b7eb86ea89f39a7730ac961d836be5507ca944b56b9c587 -Salt = c481f1ff5a182658154ebc3995568cde70ebf7776b2829ce0ca0e45c524cc8d605bc7547812ac678361da11b092222067268ff8a378579fac0c0cffc5282323413adb67e9a7cd556ff61eb2425f74c36cfecbd77d61d9426f180912fd5e45c09686b25c9 OutputLen = 40 -Output = 8ae335973600cec1f29702c42357f1501fef62762590199604c95935f5780e86e6b9b75f90697811 +Salt = a9e2f49b5c6b9032d8f5990db826ea3e1280a558a18bfc476d7b651df11d58459bd63a84e1873fd0df096b14f4c0d4ca103c9a9b054a886af79cfbaee9159e69e005d3f63cacb5331fd1e8056654ef50069241199af90815ebed4f60fd2e17526ec66898 +Secret = 6f97ca4f8c61875fc452442aac903e3f6b63f229051428d26617b0ab7c127e098b7a9395eafe4844 +Label = ba852ca1cd0cdccd87708338 +Output = 0d317a18e498fe8e9f0dfa5130190d80db5eec6439d483108157b129d8be5c0a74032fb5321f28dd [SP800-56C(SHA-512)] -Secret = 094d545961b5c597554db3db696314adbfce4f299b39ece7c1734a4ae091ee0803bcea89d82bb7f9f37a962f35f60b04967fe530ed559432f4079012d5107a00 -Salt = 835806a4c6144279bd61 OutputLen = 5 -Output = 57aa652332 +Salt = 36b6876d676c8567b81c +Secret = 876039a028357f06ac7c979b514562e850c297859076b8feba0bc6bbdaec124d5395b8c738b4070a868b12c3ecede77b404b4c1ff07a7f1cf4173f9d76d6b587 +Label = af61d372b433081bc96755e8 +Output = 3b51763389 -Secret = 5f588fca0807c8f6eb10ce5bc00323c23ee39ce41e99b8e109c8d75b23c3bf27b6e65a2959bafb30ff4176c5573c8bacacf51924af520766c770b79268ea03b2 -Salt = 3f3d78dac899df1946db15fc46322808451a96f1 OutputLen = 10 -Output = edac9170d93e26666f59 +Salt = 91b58e65538804805b04847ef28cf83aa9a11888 +Secret = 45d83073616cf9fe91303cfec0d304ff41805e7bf91adde35b94dc969020cca3af4431735616605ccf1a91d6766275d269b36f73f9ebf08fd10bf524845317ee +Label = 98148d0b58581099ba1216a0 +Output = a06e3b65b7a47eb1ba7c -Secret = 9e0d55a69f10392357e190436c67c03ef0262736577aa9ad206701005d2b91b43260f8cb53c8bfb8a8fedc21e5b0b92e3eaddf54da9688876868c9b4d49fd0a7 -Salt = 04312fe6da143bcdced3b2cfb3c36f22403283c39852786b1bfdef69e881 OutputLen = 15 -Output = ef51ed68533e6e8152958dfb23102f +Salt = 54fc1274b8de282d063b64f07cbb17e96516a583bc6d3e1cc61d820c904e +Secret = 227c8c3fe395ce3412c94b48a9e8b466c0403c935a5f166f05c493547f73ced325cc5f2a06959ac794c65b80b2783d69b69172948bc42b0138aa791a16cc7959 +Label = b3c1a9bb90b3046fcde568a8 +Output = bb46f155917ddb5da76c1ca2af5aa5 -Secret = 639e7a659c4617ac010d5b0bb6425283e68f0c1f26c22e960cbca712ffe1e6b4bc0f833c087aea773562505df509cd3b9b41df8edf3197c9a674528ac06592c0 -Salt = 9e2af69724db090b15d3a3b1dae8294146d6341716ec88e88303e7b0641f8831c5b9da031fa85d8e OutputLen = 20 -Output = dfdc584fa802128422b776e69173b0490779a05a +Salt = e97deb8064d3b11a945785fd2edd6634601ef263474921c7e325a5f7f2db03e9e3a51c039e75c73f +Secret = a5a77ee3bb607b6b23b4ae6a786c61fc7b77966b30ddbd6804d946e175082dcc197ce5aea49d02f0dc3bda7ad25e823a932ccf8abc98f09cd1b34379e83e11f8 +Label = 447b47f230508819cadbd9bb +Output = 848f99b84c5cef918af72707b969fd8b4eefa5f7 -Secret = 3f6022e37e008ac196a64088c8e5d0207b7161181527c986e0d1a279f814d2e289e90f242d068afd2c6d831f256be1dc9dc0c0479cf2b5daf2401b67f3d33882 -Salt = 0ba847a57c7f1a4df19a33c14abcb7720ae1148084512b2b67327fbb46aab89e17495a3eaee05f83c6a34c4b2a98b98aa55b OutputLen = 25 -Output = 8ca1f7058dd1aa253c8ae283244175e60eacf2bc6aa19a1c30 +Salt = 8a61b2df39258f3110229001fae9a48a2388a3da03282ea548e0d054aaa12c9db3d1b4e21f3e73ef2af908ac97cafa2c5415 +Secret = 91162085deb5ca48c1b7dc624e11090928f05f15283c0b3980a63585fe0432cb4e8cbb702d91629d0f4f7152456b580de40491fff14c4c2fb44318816b41eb36 +Label = 955281aceb9166f814a995e6 +Output = 6c0fd21c8a1e0263d23e0777a62a0b8a2cc83b9f852612cdf6 -Secret = 457a1b8869f78e52b99ba2009786e9421a979411b89b483edf98b1d2135c417673e9ba0d74f216232acc7ac7c272981a255f8cfaca10948d35d58f368d84a7b4 -Salt = fb828c4dd3ae22eda37b29629a06a3c9836995b299476009d11e5aec68020d746604b9fefafa0854b5726e21c0ce8b8ff38b12ff1f83365c7fdd1706 OutputLen = 30 -Output = ea93efce02fb99b4addb6070f8e7476b71e2ed949cdea82f08ea0544af60 +Salt = 91ccb63536acb20e03313bcc7fadb4c85b2b023086c10b14395d5fcf77d35f2ce529ecd8b9355d33a222f6921f94c99a76ec437125cf93bdafd2bea0 +Secret = 718089d09c9b767bd08a21dab8774b0decd9f752f56ca7626082e04f56d022b99f3045182c6045825dc7b0e2c53831d897544ea4d3eee8c4c783316d080ef72c +Label = dd9d7e3163b794e70351365a +Output = b5dc7546a804d6585e9e66f0adc3609b863812d56115f53da091297cfc71 -Secret = 80b3d3176eac4b87fa90c660e7cc2047969d0e890cda636b94d9a75b90ef5bc72d844e11ef970f627e4fff77ff2ee29d4fa9aa8237a071bf7dab08a1fc14a88e -Salt = b013423790cec01facd0039b075cfdf99d2e5fc25129ee0a8bad101f59a199a07255694128aa9d3d45c1e65e70ac317bc6d3a85154418e7370925848ee0e1f8ec463ee6a7f8e OutputLen = 35 -Output = 222a27ec0f50bee0794805c73e48d82f958b440b8625f86d4f94e7a02e67a2bf6f5434 +Salt = 0be69cb82bf5c0cdd1d8c1bc34754f8be38679eaf5612a924f6b7e1e4a3a2852249f4df1180b50cb2affa71483d8234b8d92ea83f8f7049632ee0d235b4ab1a3235c5270bd42 +Secret = 04b8eb02afb88419419bb87b5a93e1517f73983fd207979790e1cf654c34ba8ebc3178886f50475f9c1b729fa8f9ba9e3d538a11e483fd578ff46aae08305fa3 +Label = 6f31a270d2e1a7045e3fd31e +Output = 98d0e662639f3b95f88e1d62b1290becfe8f1927d64845b5d3d95075bcdd705bbf7edb -Secret = 516bc3bcee04192a3b6525cb8814ea315c6d80d412501538813c0d2b8e67f1b2432fbb07bbb114e439adbe1203b0a151261afac9e581dc9a9a40b6d0e8ff96ac -Salt = 8440fcdb7c51eb19adfb695bc7335500fdfb2633c59b46384d1e09972da65890ae73ecf1fcb7664a609bafd627f3fadb18d9cc0445d1de8b0bbb860d268d2b52955ead0d88d4ce51e344d6db973c1729 OutputLen = 40 -Output = 12440f8218409d964fdee31df20c5c4b8f57e300cd4a5f053ef124a4e9bf03c965f55ca7b5926734 +Salt = 84feb63c7b952ca05553e115ed5214589064036ed50b553887b2c501ff28d4ba9f84057beb04b24eed8048f56493cee228cecfe53c299ce20af2d88794c8a26f781868481a460778d6ea7932e07a6117 +Secret = 7d930466f32501a3e2d7db5ca1c0bdb8df77fcec3c02443211a9ca3a8938bce3ff9e043139e7d6a96a905979c3a0f664410c87062d9175db55487c544bc2be22 +Label = 1bc5656ed7016cbe8d3e781c +Output = 412f20c3715ab3a7fc0d2215c993c062fa25f7fb2357e5d9378401895cb0f214a792107d7a25f09a -Secret = 6a8fb368283e5bb50cc000b53622bd88ef0a880995e94edb9ea6b711b1a7a86025bd1b67257964014f7cabc3bf5c0daa4f4dbccb4274c3d029cc6da912c9220a -Salt = ffaafed83e9301eca7eaac37738df4e31df83190f20ea32532050684943bce2e8c20b703292e8a6f2dbbba9093ac6623801fa88fb826302a14822704cd757d9c9f2da64fb97122f2a1ea7037a902315a98d9556440e7ce8e89eb OutputLen = 45 -Output = 702bac672977497899f06fd50aa75a60738aa9d5aa27d0619b512e4f832cda0019628d0ea01aff3873e1602c05 +Salt = 085d11794daf67542aec5ab6d436a27a1a7697ac6a99a6929d143553f2aa179f4cb1c53d7c9d0d89ab4756fa557f88efc0605a991e1044444bb32b05bcff13d2ee5ae7ab3e97cce22d1471ed141f42aee3a7c02a5e917fa8dc7c +Secret = 6194ddff65b4c611e1acf639cd7e0edde88858a044455f43ddecfcd6203bc0a855bb735aad112950841699827a71b00933fe8b3490bd4ac950bc20bba7a102c2 +Label = 93035c91ce232f20987a9432 +Output = b509b7d53139bf23c2e623dd2ba2d10e4b0c7236ada7d2864bb2241909dada426a26c21405976525f8edd91669 -Secret = 6acdb312d6149d705734f0ba53394c8c09c355175cdf6bcbc43b1642e8907e8f94f4a8e54f3050a306c25d1d9a65eb6e7313ed3f97c59ca414c41b04f1159284 -Salt = ed50bab868e4a5de47ad609e25e2ed89bc545b869a67b62170ef53595f6820e1c32250ca8040f210b8f211e8d419d12aebacaa277a332a67b6a4c94d2442f3a53cad1e3544b059aaa796a125660fe30d2585df55071ddf6b2fed7df527afb14e2f30373e OutputLen = 50 -Output = 3bec3107b7345ee60cbcdab727f35a67db93ab7d72423c731d10b1e625f22d7ef0e8b08b886c120eb84118ffab7d784cdf0e +Salt = c1b4a76e62cefde289ab0af32dd4923b164188dc62084661fdbcb51a1cd0f47fede52b23c47799133fbeb12a8cc13159ee39e131c24d6f0d444ae7e6114c831b7c700c8c47e1fac275e63b674eeb89bb768deb20b0e9f1937a17e17c744344f255ffa32a +Secret = bd076aaba5c050ddfc53559180270fd79ada6f513aee54c2c31c2c78e4511eaf6c5869bfe81732908cd7dffd79244342212de16569cb1e58ebde10aa9822a9f6 +Label = 3d6d6946599b198cb8506a6c +Output = 6a422b3207b1e4716bde589fdadbbbc2c74a0b61272c671b3b91c4afb5466a391fe1069a16e0c5faf98f10599776ff899599 diff --git a/src/tests/data/modes/cbc.vec b/src/tests/data/modes/cbc.vec index bad6ae0c1..6839a396b 100644 --- a/src/tests/data/modes/cbc.vec +++ b/src/tests/data/modes/cbc.vec @@ -1227,3 +1227,35 @@ Key = 603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4 Nonce = 000102030405060708090A0B0C0D0E0F In = 6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710 Out = F58C4C04D6E5F1BA779EABFB5F7BFBD69CFC4E967EDB808D679F777BC6702C7D39F23369A9D9BACFA530E26304231461B2EB05E2C39BE9FCDA6C19078C6A9D1B + +# 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
\ No newline at end of file diff --git a/src/tests/data/pad.vec b/src/tests/data/pad.vec new file mode 100644 index 000000000..3c47959c9 --- /dev/null +++ b/src/tests/data/pad.vec @@ -0,0 +1,83 @@ +[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 + +[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 + +[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
\ No newline at end of file diff --git a/src/tests/data/pubkey/dlies.vec b/src/tests/data/pubkey/dlies.vec index d0546b4e0..769e3ff04 100644 --- a/src/tests/data/pubkey/dlies.vec +++ b/src/tests/data/pubkey/dlies.vec @@ -1,42 +1,815 @@ +########################### Test vectors created with bouncycastle 1.54 ########################### -P = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007 -G = 2 -X1 = 3895469730603000759730584760913911891226712505433061 -X2 = 3202115124466487737101087673031994924801994092564435 -Msg = AB5BBE0D -Ciphertext = 538F9C9CAC3EEB460B6D40B4AC331EBD3E2F3065E515177F47A083D1AC71533BF3B2931F52D71A99CA0804A633E1948F3B286453EA6CF0DD83C6DD1D2BD93B20F4942D9679CFDE5856DD81E152E1E5ADD023324B945CE68425B025AE5D0CF86C0D33244A60AF6045BD57018FFE5F84A9BF82193242FF32A64691586AAA298FE531CF06A56412DFEC3AD1F50FF8CD296310E5BB4D06E15AB0 - -P = 179769313486231590770839156793787453197860296048756011706444423684197180216158519368947833795864925541502180565485980503646440548199239100050792877003355816639229553136239076508735759914822574862575007425302077447712589550957937778424442426617334727629299387668709205606050270810842907692932019128194467627007 -G = 2 -X1 = 4556286536649761359339945350124531773703491905870156 -X2 = 4102583277207195475485889175414309483746012144669284 -Msg = C43BB390 -Ciphertext = C04F6BD6D1BFBDE74E775FB391A29B2D6FB7EE84C13D2061291DBA8708E406B0A6788F69F7DFEBE4CA35B31917EACD7D36CDBEBDCC51567ADF3F287F57592A0F73E1C990B807E0A67ACAE3F07361DF123C59E0A95CFCA9DEB3C7CCDC47C925F975AF0948B3DE9EC1E34EED30391FD4080D77DD07F091E3D5D89BC158A96485B28477AA95D62EFB9FA1D2B44A38A698F81C9518355BAE8B74 - -P = 1552518092300708935130918131258481755631334049434514313202351194902966239949102107258669453876591642442910007680288864229150803718918046342632727613031282983744380820890196288509170691316593175367469551763119843371637221007210577919 -G = 2 -X1 = 1054639601167296898572220004033907486000310327029 -X2 = 1342657759849572617856127220396675041367757265787 -Msg = 3B06E0705DC9DBA971AA624393984D5B -Ciphertext = 2AB9B180CEF08E761EDB4D7B7C538FBA0FD37BACE9416789A0DD6551F2DDC6025C76A663F1AAD5000EC03418A6220ABA6D3DC5EA82D7340E2FFCB5665AD3A2223CDFF9C39889CBE31E44CD31BCFDCEFCF2A9916FD39E2720A7B826F7E6998F734F251C71DC970AF3FB12949C14AA759966733BFC976CAD0BE71FC5DBE285200E75647C62 - -P = 1552518092300708935130918131258481755631334049434514313202351194902966239949102107258669453876591642442910007680288864229150803718918046342632727613031282983744380820890196288509170691316593175367469551763119843371637221007210577919 -G = 2 -X1 = 1019791127804545295775858763356184757983418129858 -X2 = 791304855263120499982139573682243365135340447126 -Msg = DD92A05E19BBAD4A33CEFFA0FA2727E9 -Ciphertext = 3F0300C53C0BB02A3EF2EFCC751EE5D98AE991730C1C2FE39D11A74D32D892AD63A9EECA09BBBE606FB426E03BBD480FD224E09712BB85FE649D543CBC23113A39F9102C65D31DF330ADF233735C1D60D1BCDE22744392D2D9DE50393984F276A33DD85F763ED1226B88DF1662554AD27820F66A995FE1481189A2B8C3071D0C32EE9960 - -P = 1552518092300708935130918131258481755631334049434514313202351194902966239949102107258669453876591642442910007680288864229150803718918046342632727613031282983744380820890196288509170691316593175367469551763119843371637221007210577919 -G = 2 -X1 = 1127072655127804554962850771491034708297993164117 -X2 = 909338501771729516589244957544435828677252574269 -Msg = 174E756AF8FFB51990BF3C69688D3A7F0B388F2BCE62A095BC12CD6DA2C2AD65 -Ciphertext = B99BBBC64F6320060200E6FFE7D1FE6E5EEA79DF142111AF88D377037BD9186341B7A7A27F2AE8BB77282B8EA13D821DD77186412CA3B9B5E1650A0D20687B1C8D556FD7D547D475F71BBD7D6417311F535A9A6D95CEA8AFD1146B1A1741828E8AD46B058507A67111CB62132350EEAC1212D90535677855E17B1DA9DC4CE790C4B917B1359123226FE62DCCE5475721F09CEA23 - -P = 1552518092300708935130918131258481755631334049434514313202351194902966239949102107258669453876591642442910007680288864229150803718918046342632727613031282983744380820890196288509170691316593175367469551763119843371637221007210577919 -G = 2 -X1 = 1400390629906877310807893670888997072266707870316 -X2 = 1409894924299088894270577337460879151312883489271 -Msg = 75DAD921764736E389C4224DAF7B278EC291E682044742E2E9C7A025B54DD62F -Ciphertext = C591E27A2C12742A959652F5F341F558CA0C7DAF2E6B5ACE32DCAAF459553BA23EF0235EAFD86A7F2D70587239D858484E5CD36122C2B9F6E410C7A9C307B2A2A084BB1B634A15AC9F09E38EAF421D14C5A07B6EB5EDE6915E8DE9D3D9D01DBD8822FBD79BA7FF3DF921B5451BBD9A12AB41FD4DAB829599BC2736B23753063C0C5FFCBA7DB06DE26D3C441D126FC1A46531F593 +########### 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 diff --git a/src/tests/data/pubkey/dsa_prob.vec b/src/tests/data/pubkey/dsa_prob.vec new file mode 100644 index 000000000..6af484b61 --- /dev/null +++ b/src/tests/data/pubkey/dsa_prob.vec @@ -0,0 +1,1693 @@ + +# 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 diff --git a/src/tests/data/pubkey/dsa.vec b/src/tests/data/pubkey/dsa_rfc6979.vec index a366e5574..d1651615b 100644 --- a/src/tests/data/pubkey/dsa.vec +++ b/src/tests/data/pubkey/dsa_rfc6979.vec @@ -85,3 +85,9 @@ Signature = 239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE6BD7 Hash = SHA-512 Signature = 89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1 + +# Msg that produces a hash with leading zeros. Test created with BouncyCastle +Msg = FCABA2CF434AC8DCFCEC + +Hash = SHA-1 +Signature = 98158AC13279EA8059872EBEEA4E5F334208FF361B2898667C151F8CC883E0728C333DB65612570200D7911EBF1C89C2932FB95399CB0CC533EC172B5CEAA08B
\ No newline at end of file diff --git a/src/tests/data/pubkey/ecc.vec b/src/tests/data/pubkey/ecc.vec index a9debe2bc..dccbff992 100644 --- a/src/tests/data/pubkey/ecc.vec +++ b/src/tests/data/pubkey/ecc.vec @@ -1256,3 +1256,212 @@ Y = 0x010B44733807924D98FF580C1311112C0F4A394AEF83B25688BF54DE5D66F93BD2444C1C88 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 diff --git a/src/tests/data/pubkey/ecdh.vec b/src/tests/data/pubkey/ecdh.vec index 272cc1906..085041b1a 100644 --- a/src/tests/data/pubkey/ecdh.vec +++ b/src/tests/data/pubkey/ecdh.vec @@ -506,3 +506,104 @@ K = 00c2bfafcd7fbd3e2fd1c750fdea61e70bd4787a7e68468c574ee99ebc47eedef064e8944a73 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 diff --git a/src/tests/data/pubkey/ecdsa_prob.vec b/src/tests/data/pubkey/ecdsa_prob.vec new file mode 100644 index 000000000..17bea592e --- /dev/null +++ b/src/tests/data/pubkey/ecdsa_prob.vec @@ -0,0 +1,987 @@ + +# 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 diff --git a/src/tests/data/pubkey/ecdsa.vec b/src/tests/data/pubkey/ecdsa_rfc6979.vec index 311734c97..98c2e2f6c 100644 --- a/src/tests/data/pubkey/ecdsa.vec +++ b/src/tests/data/pubkey/ecdsa_rfc6979.vec @@ -161,6 +161,7 @@ Msg = 73616D706C65 Hash = SHA-1 Signature = 00343B6EC45728975EA5CBA6659BBB6062A5FF89EEA58BE3C80B619F322C87910FE092F7D45BB0F8EEE01ED3F20BABEC079D202AE677B243AB40B5431D497C55D75D00E7B0E675A9B24413D448B8CC119D2BF7B2D2DF032741C096634D6D65D0DBE3D5694625FB9E8104D3B842C1B0E2D0B98BEA19341E8676AEF66AE4EBA3D5475D5D16 + Hash = SHA-224 Signature = 01776331CFCDF927D666E032E00CF776187BC9FDD8E69D0DABB4109FFE1B5E2A30715F4CC923A4A5E94D2503E9ACFED92857B7F31D7152E0F8C00C15FF3D87E2ED2E0050CB5265417FE2320BBB5A122B8E1A32BD699089851128E360E620A30C7E17BA41A666AF126CE100E5799B153B60528D5300D08489CA9178FB610A2006C254B41F @@ -340,3 +341,38 @@ Signature = 00C114E2B133AD8E725AF43AEFC381BE87063DB3FC00CAFAEB1949015CF4EC9EC247 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 diff --git a/src/tests/data/pubkey/ecies-18033.vec b/src/tests/data/pubkey/ecies-18033.vec new file mode 100644 index 000000000..8937abd2c --- /dev/null +++ b/src/tests/data/pubkey/ecies-18033.vec @@ -0,0 +1,66 @@ +# 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 diff --git a/src/tests/data/pubkey/ecies.vec b/src/tests/data/pubkey/ecies.vec new file mode 100644 index 000000000..a8dd03a48 --- /dev/null +++ b/src/tests/data/pubkey/ecies.vec @@ -0,0 +1,273 @@ +# 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 diff --git a/src/tests/data/pubkey/eckcdsa.vec b/src/tests/data/pubkey/eckcdsa.vec new file mode 100644 index 000000000..d9bd659e2 --- /dev/null +++ b/src/tests/data/pubkey/eckcdsa.vec @@ -0,0 +1,29 @@ + +# 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 = 3CA29800D425FCAA51CCB209B4ED5D6C352108223143B2EA5A0E8644CE8F768A6FA4D193C726AD08019788E5
\ No newline at end of file diff --git a/src/tests/data/pubkey/rsa_kem.vec b/src/tests/data/pubkey/rsa_kem.vec index a55523533..0ffb8a535 100644 --- a/src/tests/data/pubkey/rsa_kem.vec +++ b/src/tests/data/pubkey/rsa_kem.vec @@ -2,6 +2,15 @@ # 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 @@ -9,14 +18,131 @@ Q = 7946160702304382413489699221154321023693320510541434424021891484689526768797 R = 032E45326FA859A72EC235ACFF929B15D1372E30B207255F0611B8F785D764374152E0AC009E509E7BA30CD2F1778E113B64E135CF4E2292C75EFE5288EDFDA4 C0 = 4603E5324CAB9CEF8365C817052D954D44447B1667099EDC69942D32CD594E4FFCF268AE3836E2C35744AAA53AE201FE499806B67DEDAA26BF72ECBD117A6FC0 KDF = KDF2(SHA-1) -K = 0E6A26EB7B956CCB8B3BDC1CA975BC57C3989E8FBAD31A224655D800C46954840F +K = 0E6A26EB7B956CCB8B3BDC1CA975BC57C3989E8FBAD31A224655D800C46954840FF32052CDF0D640562BDFADFA263CFCCF3C52B29F2AF4A1869959BC77F854CF15BD7A25192985A842DBFF8E13EFEE5B7E7E55BBE4D389647C686A9A9AB3FB889B2D7767D3837EEA4E0A2F04B53CA8F50FB31225C1BE2D0126C8C7A4753B0807 -# Test C.6.4 +# 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 +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 diff --git a/src/tests/data/pubkey/rsa_sig.vec b/src/tests/data/pubkey/rsa_sig.vec index a5420fc33..18a9b55d4 100644 --- a/src/tests/data/pubkey/rsa_sig.vec +++ b/src/tests/data/pubkey/rsa_sig.vec @@ -7,6 +7,15 @@ Msg = 4161436445664768496A4B Signature = 3A3B7502D85F05128CFB74608205031339753DA50D0DB7E268C3951F04A1981EDE22613BFC38DB9FFEBE183A4F11B0B0F8D7BEB668F7C1C385A801C2DDD7C08CB2E56082F80AD1105E930ED96DB6A0309639A51F5379B682C7F75C601BD4ADE5 Padding = EMSA1(SHA-1) +E = 5 +P = 29325971601394553435876545177861015867159370596202565748032715224855053574888335295064118595233157878850644746476053 +Q = 36340726116985810749584556273749590346658800038386619768155308882211829358443758608966414537457415767576889158645019 + +# Msg that produces a hash with leading zeros. Test created with BouncyCastle +Msg = FCABA2CF434AC8DCFCEC +Signature = 39ED15BA0A0A5546A634A8D94CB9750FFB968C4DF184DA76B6ACDF89D8E0C37475E2DB053F75DF9AE3FB317B199E4ABAD3C9279EEAD5481C8F3B1B5EEBBE3A95137234AB8C6D04E9ECE72A20DC7759B1836F392B99F5F095A4591639B63B6999 + +Padding = EMSA1(SHA-1) E = 79 P = 12623509009920451943188704532558549088394176932350155718346677596667742587560163977859877379200333095446158075633025630956096613873547787137410366502605473 Q = 10058994615186918965498012083239602676614988922192055472853974106579876551963188584799215667527538830845937432743673569788902953125963992649722735254207979 diff --git a/src/tests/data/stream/chacha.vec b/src/tests/data/stream/chacha.vec index 1c3c18c7c..f51ff0812 100644 --- a/src/tests/data/stream/chacha.vec +++ b/src/tests/data/stream/chacha.vec @@ -1,3 +1,104 @@ +[ChaCha(8)] + +# Tests got from the original implementation of Daniel J. Bernstein + +Key = 00000000000000000000000000000000 +Nonce = 0000000000000000 +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B + +Key = 0000000000000000000000000000000000000000000000000000000000000000 +Nonce = 000000000000000000000002 +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = FD74BC4D822E344ACA041ACB39789BDA359D16B7709A7676B03B0F06117685B33B5E1E7DB844BE88ACCFC8370C808FB4BFBFDE831358476F09E34F2045AE61C0AC4120E44862548D3E5B577C695005115CFB158B9B6341BFC0561B9EAEE34D114583FB5FC901D5EA85019EAD2D4F618A5FC97954A5913576CD6BA32E710DA15A52D9A5B74B6E2F1D333C6405A5D6F64E2B1CED579A5FFBEB390A756755FED56AF37061CCC3A1D4DF6421F7A4D7811919F95A7F8533826DAB256A09E58CBFC5A04F83B063BBB169D2B05AFA6C8B3EC5880DB3346193860671AFFB3F9A5B56F771231393330816FFBD0E66F6D6B598178461CF5BE424A84A8D426DDB4B88FCB275 + +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +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 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = E28A5FA4A67F8C5DEFED3E6FB7303486AA8427D31419A729572D777953491120B64AB8E72B8DEB85CD6AEA7CB6089A101824BEEB08814A428AAB1FA2C816081B8A26AF448A1BA906368FD8C83831C18CEC8CED811A028E675B8D2BE8FCE081165CEAE9F1D1B7A975497749480569CEB83DE6A0A587D4984F19925F5D338E430D + +Key = 0000000000000000000000000000000000000000000000000000000000000000 +Nonce = 0000000000000000 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 3E00EF2F895F40D67F5BB8E81F09A5A12C840EC3CE9A7F3B181BE188EF711A1E984CE172B9216F419F445367456D5619314A42A3DA86B001387BFDB80E0CFE42D2AEFA0DEAA5C151BF0ADB6C01F2A5ADC0FD581259F9A2AADCF20F8FD566A26B5032EC38BBC5DA98EE0C6F568B872A65A08ABF251DEB21BB4B56E5D8821E68AA + +Key = 01000000000000000000000000000000 +Nonce = 0000000000000000 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 03A7669888605A0765E8357475E58673F94FC8161DA76C2A3AA2F3CAF9FE5449E0FCF38EB882656AF83D430D410927D55C972AC4C92AB9DA3713E19F761EAA147138C25C8A7CE3D5E7546746FFD2E3515CE6A4B1B2D3F380138668ED39FA92F8A1AEE36258E05FAE6F566673511765FDB59E05163D55A708C5F9BC45045124CB + +Key = 0100000000000000000000000000000000000000000000000000000000000000 +Nonce = 0000000000000000 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = CF5EE9A0494AA9613E05D5ED725B804B12F4A465EE635ACC3A311DE8740489EA289D04F43C7518DB56EB4433E498A1238CD8464D3763DDBB9222EE3BD8FAE3C8B4355A7D93DD8867089EE643558B95754EFA2BD1A8A1E2D75BCDB32015542638291941FEB49965587C4FDFE219CF0EC132A6CD4DC067392E67982FE53278C0B4 + +Key = 00000000000000000000000000000000 +Nonce = 0100000000000000 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 25F5BEC6683916FF44BCCD12D102E692176663F4CAC53E719509CA74B6B2EEC85DA4236FB29902012ADC8F0D86C8187D25CD1C486966930D0204C4EE88A6AB355A6C9976C7BC6E78BAF3108C5364EF42B93B35D2694D2DDF72A4FC7ECDB968FCFE16BEDB8D48102FB54F1CE3636E914C0E2DADC7CAA2AB1929733A9263325E72 + +Key = 0000000000000000000000000000000000000000000000000000000000000000 +Nonce = 0100000000000000 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 2B8F4BB3798306CA5130D47C4F8D4ED13AA0EDCCC1BE6942090FAEECA0D7599B7FF0FE616BB25AA0153AD6FDC88B954903C22426D478B97B22B8F9B1DB00CF06470BDFFBC488A8B7C701EBF4061D75C5969186497C95367809AFA80BD843B040A79ABC6E73A91757F1DB73C8EACFA543B38F289D065AB2F3032D377B8C37FE46 + +Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +Nonce = FFFFFFFFFFFFFFFF +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 2204D5B81CE662193E00966034F91302F14A3FB047F58B6E6EF0D721132304163E0FB640D76FF9C3B9CD99996E6E38FAD13F0E31C82244D33ABBC1B11E8BF12D9A81D78E9E56604DDFAE136921F51C9D81AE15119DB8E756DD28024493EE571D363AE4BBCD6E7D300F99D2673AEB92CCFC6E43A38DC31BACD66B28F17B22B28A + +Key = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF +Nonce = FFFFFFFFFFFFFFFF +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = E163BBF8C9A739D18925EE8362DAD2CDC973DF05225AFB2AA26396F2A9849A4A445E0547D31C1623C537DF4BA85C70A9884A35BCBF3DFAB077E98B0F68135F5481D4933F8B322AC0CD762C27235CE2B31534E0244A9A2F1FD5E94498D47FF108790C009CF9E1A348032A7694CB28024CD96D3498361EDB1785AF752D187AB54B + +Key = 55555555555555555555555555555555 +Nonce = 5555555555555555 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = F0A23BC36270E18ED0691DC384374B9B2C5CB60110A03F56FA48A9FBBAD961AA6BAB4D892E96261B6F1A0919514AE56F86E066E17C71A4176AC684AF1C931996950F754E728BD061D176ECF571C62A5EA5C776697B3193D3EA94CF17D7F0A14E504859D1A67C248AB298BE3BB7EDED3A23F61B6C5BD1A5A4CFC84BFC3D295AC5 + +Key = 5555555555555555555555555555555555555555555555555555555555555555 +Nonce = 5555555555555555 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 7CB78214E4D3465B6DC62CF7A1538C88996952B4FB72CB6105F1243CE3442E2975A59EBCD2B2A598290D7538491FE65BDBFEFD060D88798120A70D049DC2677DD48FF5A2513E497A5D54802D7484C4F1083944D8D0D14D6482CE09F7E5EBF20B29807D62C31874D02F5D3CC85381A745ECBC60525205E300A76961BFE51AC07C + +Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +Nonce = AAAAAAAAAAAAAAAA +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 312D95C0BC38EFF4942DB2D50BDC500A30641EF7132DB1A8AE838B3BEA3A7AB03815D7A4CC09DBF5882A3433D743ACED48136EBAB73299506855C0F5437A36C6EF5AD3D6A4F6C35D9D66C2E34005B91BBBE3099E135A00CE2F700745BE6253195824D4B19F69731B6177E624358C7977E67552F519B470E3F7A8EC965DC3BEDA + +Key = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +Nonce = AAAAAAAAAAAAAAAA +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 40F9AB86C8F9A1A0CDC05A75E5531B612D71EF7F0CF9E387DF6ED6972F0AAE21311AA581F816C90E8A99DE990B6B95AAC92450F4E112712667B804C99E9C6EDAF8D144F560C8C0EA36880D3B77874C9A9103D147F6DED386284801A4EE158E5EA4F9C093FC55FD344C33349DC5B699E21DC83B4296F92EE3ECABF3D51F95FE3F + +Key = 00112233445566778899AABBCCDDEEFF +Nonce = 0F1E2D3C4B5A6978 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 29560D280B4528400A8F4B795369FB3A01105599E9F1ED58279CFC9ECE2DC5F99F1C2E52C98238F542A5C0A881D850B615D3ACD9FBDB026E9368565DA50E0D49DD5BE8EF74248B3E251D965D8FCB21E7CFE204D4007806FBEE3CE94C74BFBAD2C11C621BA048147C5CAA94D182CCFF6FD5CF44ADF96E3D68281BB49676AF87E7 + +Key = 00112233445566778899AABBCCDDEEFFFFEEDDCCBBAA99887766554433221100 +Nonce = 0F1E2D3C4B5A6978 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = DB43AD9D1E842D1272E4530E276B3F568F8859B3F7CF6D9D2C74FA53808CB5157A8EBF46AD3DCC4B6C7DADDE131784B0120E0E22F6D5F9FFA7407D4A21B695D9C5DD30BF55612FAB9BDD118920C19816470C7F5DCD42325DBBED8C57A56281C144CB0F03E81B3004624E0650A1CE5AFAF9A7CD8163F6DBD72602257DD96E471E + +Key = C46EC1B18CE8A878725A37E780DFB735 +Nonce = 1ADA31D5CF688221 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 6A870108859F679118F3E205E2A56A6826EF5A60A4102AC8D4770059FCB7C7BAE02F5CE004A6BFBBEA53014DD82107C0AA1C7CE11B7D78F2D50BD3602BBD25940560BB6A84289E0B38F5DD21D6EF6D7737E3EC0FB772DA2C71C2397762E5DBBBF449E3D1639CCBFA3E069C4D871ED6395B22AAF35C8DA6DE2DEC3D77880DA8E8 + +Key = C46EC1B18CE8A878725A37E780DFB7351F68ED2E194C79FBC6AEBEE1A667975D +Nonce = 1ADA31D5CF688221 +In = 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 838751B42D8DDD8A3D77F48825A2BA752CF4047CB308A5978EF274973BE374C96AD848065871417B08F034E681FE46A93F7D5C61D1306614D4AAF257A7CFF08B16F2FDA170CC18A4B58A2667ED962774AF792A6E7F3C77992540711A7A136D7E8A2F8D3F93816709D45A3FA5F8CE72FDE15BE7B841ACBA3A2ABD557228D9FE4F [ChaCha(12)] @@ -43,8 +144,413 @@ In = 00000000000000000000000000000000000000000000000000000000000000000000000000 Out = F798A189F195E66982105FFB640BB7757F579DA31602FC93EC01AC56F85AC3C134A4547B733B46413042C9440049176905D3BE59EA1C53F15916155C2BE8241A38008B9A26BC35941E2444177C8ADE6689DE95264986D95889FB60E84629C9BD9A5ACB1CC118BE563EB9B3A4A472F82E09A7E778492B562EF7130E88DFE031C79DB9D4F7C7A899151B9A475032B63FC385245FE054E3DD5A97A5F576FE064025D3CE042C566AB2C507B138DB853E3D6959660996546CC9C4A6EAFDC777C040D70EAF46F76DAD3979E5C5360C3317166A1C894C94A371876A94DF7628FE4EAAF2CCB27D5AAAE0AD7AD0F9D4B6AD3B54098746D4524D38407A6DEB # From draft-irtf-cfrg-chacha20-poly1305-03 +# Key = 0000000000000000000000000000000000000000000000000000000000000000 Nonce = 000000000000000000000002 In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Out = C2C64D378CD536374AE204B9EF933FCD1A8B2288B3DFA49672AB765B54EE27C78A970E0E955C14F3A88E741B97C286F75F8FC299E8148362FA198A39531BED6D +# Test seek offset +# Tests got from the original implementation of Daniel J. Bernstein +# +Seek = 0 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 103AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED + +Seek = 1 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 3AF111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89 + +Seek = 2 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = F111C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB + +Seek = 3 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 11C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08 + +Seek = 4 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = C18B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB0800 + +Seek = 5 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 8B549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB080029 + +Seek = 6 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 549D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917 + +Seek = 7 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 9D39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A5 + +Seek = 8 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 39248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540 + +Seek = 9 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 248FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7 + +Seek = 10 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 8FB07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B783 + +Seek = 11 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = B07D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833F + +Seek = 12 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 7D60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3 + +Seek = 13 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 60C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF398 + +Seek = 14 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = C29A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D + +Seek = 15 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 9A95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E + +Seek = 16 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 95D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63 + +Seek = 17 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = D1DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C9 + +Seek = 18 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = DB88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970 + +Seek = 19 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 88D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2 + +Seek = 20 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = D892F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E7 + +Seek = 21 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 92F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E751 + +Seek = 22 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = F7B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174 + +Seek = 23 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = B4AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174AD + +Seek = 24 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = AF709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9 + +Seek = 25 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 709A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6 + +Seek = 26 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 9A5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E697 + +Seek = 27 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 5FD47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972F + +Seek = 28 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = D47A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC5 + +Seek = 29 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 7A9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575 + +Seek = 30 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 9E4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0 + +Seek = 31 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 4BD5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A6 + +Seek = 32 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = D5FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63C + +Seek = 33 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = FF9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC + +Seek = 34 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 9A658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC80 + +Seek = 35 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 658DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802C + +Seek = 36 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 8DD52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3 + +Seek = 37 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = D52C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E6 + +Seek = 38 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 2C708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61E + +Seek = 39 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 708BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1 + +Seek = 40 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 8BEF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198 + +Seek = 41 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = EF1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB19837 + +Seek = 42 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 1F0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB1983732 + +Seek = 43 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 0F622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276 + +Seek = 44 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 622B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D8 + +Seek = 45 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 2B3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865 + +Seek = 46 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 3747040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D86594 + +Seek = 47 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 47040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F + +Seek = 48 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 040FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F23 + +Seek = 49 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 0FA3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E + +Seek = 50 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = A3551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84 + +Seek = 51 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 551300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A9 + +Seek = 52 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 1300B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974 + +Seek = 53 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 00B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD + +Seek = 54 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = B1F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28 + +Seek = 55 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = F293150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B8 + +Seek = 56 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 93150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B + +Seek = 57 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 150A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12 + +Seek = 58 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 0A88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8 + +Seek = 59 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 88620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D9 + +Seek = 60 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 620D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907 + +Seek = 61 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 0D5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D90790 + +Seek = 62 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 5FED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F + +Seek = 63 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = ED89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9E + +Seek = 64 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = 89FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED6 + +Seek = 65 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = FB08002917A540B7833FF3981D0E63C970B2E75174ADB9E6972FC575C0A63CEC802CF3E61EB198373276D865948F237E84A974FD28B89B12B8D907904F9ED679 + +Seek = 4294967232 +Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F +Nonce = 000102030405060708090A0B +In = 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +Out = DBF81BB406517BE1A54F4740E5DDDF2B7965747B757FA9D5B7EDD6B27FEDDB89D5D47F9B24E57DF393017A5079F61852CD8B86859884120AF867D25D3B259E2B diff --git a/src/tests/data/x931.vec b/src/tests/data/x931.vec index abdbc0708..4a2c33a86 100644 --- a/src/tests/data/x931.vec +++ b/src/tests/data/x931.vec @@ -1,2052 +1,1541 @@ +# X9.31 RNG tests -[X9.31-RNG(AES-128)] +[AES-128] IKM = C592BF6A04D72BB1CBEAF590B7CCA6BC80000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BA -L = 16 Out = CF08AD39D7DA4FCDBE158347EE3752A3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCC0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BB -L = 16 Out = 07BDFB5F94D0CB20F668161CE7E25E36 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCE0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BC -L = 16 Out = 81A997CAAA8EE7403D03A8F0AA6A588C IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCF0000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BD -L = 16 Out = B00B42011B37494912AA2DE456FE6284 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCF8000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BE -L = 16 Out = D42AA72455C3AE5AD634A5A4B3D577D2 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFC000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642BF -L = 16 Out = 0D06CB87B99641C38A5411EC3D273E70 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFE000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C0 -L = 16 Out = 459E5E2D6976A5B34FD18926EE1E0BB7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFF000000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C1 -L = 16 Out = 53F2D091AD47E858555371AC9BE9F3DA IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFF800000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C2 -L = 16 Out = 1A72444D745503F63B340E0F294726DC IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFC00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C3 -L = 16 Out = 6FA57C78F09768AEA09ABB7DC5EA2944 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFE00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C4 -L = 16 Out = 6E549FCCD3BE7B6B70B317BC04B5AB01 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFF00000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C5 -L = 16 Out = 7FF7C3F80E9A7C323B822FA436D6AA2F IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFF80000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C6 -L = 16 Out = 52FF54A163E97610EAF318E7EE7CEC7E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFC0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C7 -L = 16 Out = 4FF5C162147653F594105D480D9F24F7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFE0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C8 -L = 16 Out = 1F863D1EA9EA0E1D741D195249B6AF21 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFF0000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642C9 -L = 16 Out = A87313E2771F16B842DB27D3E55AB0B0 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFF8000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CA -L = 16 Out = A45BBF6E2ED76655119273112AFE1C6A IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFC000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CB -L = 16 Out = E135FBD5BE6CB13B0A5A76696BCF46F6 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFE000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CC -L = 16 Out = 5A0601F625C622CC97D6CAE9BA0AB6BB IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFF000000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CD -L = 16 Out = A9662449F9AC50293766DEC60334B8F0 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFF800000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CE -L = 16 Out = F80A41023F9E350E1D2F86DB10CBB329 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFC00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642CF -L = 16 Out = 334EB3E404DE9F452C647C05EE09E3E6 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFE00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D0 -L = 16 Out = 5B2C202C018A5E482D5035B18905BF46 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFF00000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D1 -L = 16 Out = 9E9E63D29CFB4757FDDEC2B35147D830 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFF80000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D2 -L = 16 Out = EAAC43B87260BC73BFFDFABF5BCF94A9 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFC0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D3 -L = 16 Out = 4B378D2FF53B5FF913AA2064D04285D5 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFE0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D4 -L = 16 Out = DBC25FE1203EA0E64F1D5C2E2F056F87 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFF0000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D5 -L = 16 Out = D3C96C9C5905DC56A292A7A98AAC9234 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFF8000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D6 -L = 16 Out = 0A9223570A1288EB47595D6D18994353 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFC000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D7 -L = 16 Out = E43B8F94C2B557259920C10A51A38543 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFE000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D8 -L = 16 Out = 9B86C73D371FDAD1432065F9EB6BB6D2 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFF000000000000000000000000EB8DE39CF261EE2C7389B748F8B642D9 -L = 16 Out = 13F949FF373A58947D8C6543FEB81F93 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFF800000000000000000000000EB8DE39CF261EE2C7389B748F8B642DA -L = 16 Out = 2F7D996CB269EDC9B7902FF6D061C302 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFC00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DB -L = 16 Out = 801AF9A32F49A1F3A43DBB22DB281DFC IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFE00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DC -L = 16 Out = 8914E2CE1F46B13624AB93FDE9104214 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFF00000000000000000000000EB8DE39CF261EE2C7389B748F8B642DD -L = 16 Out = C1D223A2A1785EF3CE6128333DD95347 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFF80000000000000000000000EB8DE39CF261EE2C7389B748F8B642DE -L = 16 Out = 538FEEC081411A95767AA722BCFB8C0E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFC0000000000000000000000EB8DE39CF261EE2C7389B748F8B642DF -L = 16 Out = 0CCDCCA45FF772D0D02F53D823BB4C9E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFE0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E0 -L = 16 Out = 550B87DA4C940750ABB829E43522F4D7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFF0000000000000000000000EB8DE39CF261EE2C7389B748F8B642E1 -L = 16 Out = 3E17DE96FFF84D276E8156ADC9E35007 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFF8000000000000000000000EB8DE39CF261EE2C7389B748F8B642E2 -L = 16 Out = 06F0855A2F6CE7DFF53F59A6994017AE IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFC000000000000000000000EB8DE39CF261EE2C7389B748F8B642E3 -L = 16 Out = 741FA68C1FEF02AF6DFCE803379AF7B8 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFE000000000000000000000EB8DE39CF261EE2C7389B748F8B642E4 -L = 16 Out = A7F64667398AECDEC34481265FE59235 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFF000000000000000000000EB8DE39CF261EE2C7389B748F8B642E5 -L = 16 Out = F19F46D46822951708F4E194F4960A56 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFF800000000000000000000EB8DE39CF261EE2C7389B748F8B642E6 -L = 16 Out = 6E7AF2F730E9CF4CCA2E69D5067DDC76 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFC00000000000000000000EB8DE39CF261EE2C7389B748F8B642E7 -L = 16 Out = CA15A95DFB686938D97D804298D094AA IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFE00000000000000000000EB8DE39CF261EE2C7389B748F8B642E8 -L = 16 Out = F76DAEB0ED23167614294AC2F8E9EE9A IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFF00000000000000000000EB8DE39CF261EE2C7389B748F8B642E9 -L = 16 Out = C66A4B38050953805598F4EAF203CDE4 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFF80000000000000000000EB8DE39CF261EE2C7389B748F8B642EA -L = 16 Out = 76A726ED76276D5E7119AF0CCAED854A IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFC0000000000000000000EB8DE39CF261EE2C7389B748F8B642EB -L = 16 Out = EB8FE9FF9A053DD2F132B11F17F53D78 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFE0000000000000000000EB8DE39CF261EE2C7389B748F8B642EC -L = 16 Out = A6C5E4E13C36E80E1BBB046E6377D290 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFF0000000000000000000EB8DE39CF261EE2C7389B748F8B642ED -L = 16 Out = 75B476973CF532F655B8BF80CB6AC2A3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFF8000000000000000000EB8DE39CF261EE2C7389B748F8B642EE -L = 16 Out = 3AC698CFC1EF3ED72C26CAF5347DF997 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFC000000000000000000EB8DE39CF261EE2C7389B748F8B642EF -L = 16 Out = 167ECAE8C6F793FEB00A69E3A9FAF332 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFE000000000000000000EB8DE39CF261EE2C7389B748F8B642F0 -L = 16 Out = 8F2906AF93A28FFFBFD83D5D7E6D7F72 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFF000000000000000000EB8DE39CF261EE2C7389B748F8B642F1 -L = 16 Out = 5BBA7C625C23F69354A61CCF2289A1B3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFF800000000000000000EB8DE39CF261EE2C7389B748F8B642F2 -L = 16 Out = 0083A3EC21348F22B0039759AE762A2F IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFC00000000000000000EB8DE39CF261EE2C7389B748F8B642F3 -L = 16 Out = 5E2864DD971DB13227F06535D52C24AE IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFE00000000000000000EB8DE39CF261EE2C7389B748F8B642F4 -L = 16 Out = D5792243D3B9BD5C7299151685192BBA IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFF00000000000000000EB8DE39CF261EE2C7389B748F8B642F5 -L = 16 Out = 7B26CD6C3468209850FDF7F67448FAB7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFF80000000000000000EB8DE39CF261EE2C7389B748F8B642F6 -L = 16 Out = 717586F8B816B273A691D3379005301E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFC0000000000000000EB8DE39CF261EE2C7389B748F8B642F7 -L = 16 Out = 33D8F8DDF2A5E97E9CB1C032735BEF21 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFE0000000000000000EB8DE39CF261EE2C7389B748F8B642F8 -L = 16 Out = B277E4BA071293C54D84A29637273B04 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFF0000000000000000EB8DE39CF261EE2C7389B748F8B642F9 -L = 16 Out = FBD6F5662D222FC9C55332A60F747879 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFF8000000000000000EB8DE39CF261EE2C7389B748F8B642FA -L = 16 Out = 88FF65F58F6F4BF35DB846BB2132DEC6 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFC000000000000000EB8DE39CF261EE2C7389B748F8B642FB -L = 16 Out = BE12ADEDECB8DCFF2723E1D5F0D9C753 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFE000000000000000EB8DE39CF261EE2C7389B748F8B642FC -L = 16 Out = 5A368FCCC787680145BBFBDA64BE16C6 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFF000000000000000EB8DE39CF261EE2C7389B748F8B642FD -L = 16 Out = A804DC10C6223194AE4310D7C628DBAF IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFF800000000000000EB8DE39CF261EE2C7389B748F8B642FE -L = 16 Out = 1DE5494C7B609ABD1406FB318B572DE7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFC00000000000000EB8DE39CF261EE2C7389B748F8B642FF -L = 16 Out = 78566AA937E9C90D764DFB1D5723140B IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFE00000000000000EB8DE39CF261EE2C7389B748F8B64300 -L = 16 Out = 9F42A9F1512DA372008DF3D469B4AD04 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFF00000000000000EB8DE39CF261EE2C7389B748F8B64301 -L = 16 Out = C80993A52AE00A74A64FAD42EC586FF5 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFF80000000000000EB8DE39CF261EE2C7389B748F8B64302 -L = 16 Out = 3AFC74E774FE9B27202B8596C5B1396E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFC0000000000000EB8DE39CF261EE2C7389B748F8B64303 -L = 16 Out = 64829EB2B232687C9CE32F8A91274497 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFE0000000000000EB8DE39CF261EE2C7389B748F8B64304 -L = 16 Out = E9795D38B5A1AAD7901C7765CF4F23B2 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFF0000000000000EB8DE39CF261EE2C7389B748F8B64305 -L = 16 Out = 28989B6F2458E95A32485C7050DB4155 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFF8000000000000EB8DE39CF261EE2C7389B748F8B64306 -L = 16 Out = 3DFFB7C3CDBB9C3B27A5CCCFDAFA9AAE IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFC000000000000EB8DE39CF261EE2C7389B748F8B64307 -L = 16 Out = 4B42865DA59E224D8CD7587D8C4AD73E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFE000000000000EB8DE39CF261EE2C7389B748F8B64308 -L = 16 Out = 19316BB7F4041A621BD659FBD34397D6 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFF000000000000EB8DE39CF261EE2C7389B748F8B64309 -L = 16 Out = 963835BE55A1E143D1F2F56BCA837BBE IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFF800000000000EB8DE39CF261EE2C7389B748F8B6430A -L = 16 Out = 2C614F8E813AF275902D7139B08C0998 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFC00000000000EB8DE39CF261EE2C7389B748F8B6430B -L = 16 Out = 6B0F6D50554C31C8439ECEAC28B2C256 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFE00000000000EB8DE39CF261EE2C7389B748F8B6430C -L = 16 Out = B6D80EEEC39FBB091ADC6BB3BB5D5A67 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFF00000000000EB8DE39CF261EE2C7389B748F8B6430D -L = 16 Out = 6C8D5E16792215E76E73FD4650A407DB IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFF80000000000EB8DE39CF261EE2C7389B748F8B6430E -L = 16 Out = AA6E5BE4C0C26EEC0161D364F0FF7DE3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFC0000000000EB8DE39CF261EE2C7389B748F8B6430F -L = 16 Out = 1CC202A40F8ED80D5559BB2B29E96A65 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFE0000000000EB8DE39CF261EE2C7389B748F8B64310 -L = 16 Out = 0B4B9B6139443912D9492EE91A1769CB IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFF0000000000EB8DE39CF261EE2C7389B748F8B64311 -L = 16 Out = C10EBF773A13A852500F2025AB965540 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFF8000000000EB8DE39CF261EE2C7389B748F8B64312 -L = 16 Out = 5221FDCFA12F36E4E893E902A54999E8 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFC000000000EB8DE39CF261EE2C7389B748F8B64313 -L = 16 Out = E9090364194100265EF53E91299865FB IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFE000000000EB8DE39CF261EE2C7389B748F8B64314 -L = 16 Out = 8CD5E4284B02C8B711DE7B234F6484F7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFF000000000EB8DE39CF261EE2C7389B748F8B64315 -L = 16 Out = 76F5D704C6B17CF7397C58D3021C2FBC IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFF800000000EB8DE39CF261EE2C7389B748F8B64316 -L = 16 Out = F157BFB5FBF1011BD22292D947D12986 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFC00000000EB8DE39CF261EE2C7389B748F8B64317 -L = 16 Out = 2D2BD62F2AD0EE7854072B7F6860FFCA IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFE00000000EB8DE39CF261EE2C7389B748F8B64318 -L = 16 Out = 3D96768C1F0796A39077BE1C70301FD4 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFF00000000EB8DE39CF261EE2C7389B748F8B64319 -L = 16 Out = D5073B8CF890C43AEE43AE333D57D642 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFF80000000EB8DE39CF261EE2C7389B748F8B6431A -L = 16 Out = D38ADEA6FE821453B9EB88D9CADAD3F4 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFC0000000EB8DE39CF261EE2C7389B748F8B6431B -L = 16 Out = F4F66618DBFED3C4B90AD93FAC1083F8 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFE0000000EB8DE39CF261EE2C7389B748F8B6431C -L = 16 Out = 930AD1D86D3ECA7A0692766CD1E40490 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFF0000000EB8DE39CF261EE2C7389B748F8B6431D -L = 16 Out = 63D8247A053BBE984B9840CFB7D90DD2 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFF8000000EB8DE39CF261EE2C7389B748F8B6431E -L = 16 Out = 827D954277E357D0453BBC537C9AB221 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFC000000EB8DE39CF261EE2C7389B748F8B6431F -L = 16 Out = 9E2BDF167485A3AE004F0643E775CF42 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFE000000EB8DE39CF261EE2C7389B748F8B64320 -L = 16 Out = 445A3F86B2FC284BB933CBC68649E4CC IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFF000000EB8DE39CF261EE2C7389B748F8B64321 -L = 16 Out = F6AEADC9A5A8DF7A1664B4CD055E42B4 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFF800000EB8DE39CF261EE2C7389B748F8B64322 -L = 16 Out = 1B43269E05CD108EE91AAA0ECC1CA831 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFC00000EB8DE39CF261EE2C7389B748F8B64323 -L = 16 Out = 857EEB71AB8F12AE4051B825F6B7B686 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFE00000EB8DE39CF261EE2C7389B748F8B64324 -L = 16 Out = C92EF523170FDEBA77CFA50D84742D68 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFF00000EB8DE39CF261EE2C7389B748F8B64325 -L = 16 Out = DC8C52D3698E8356F9D0F77361D8F26E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFF80000EB8DE39CF261EE2C7389B748F8B64326 -L = 16 Out = 86A95BA023CBE3E5A5911D5CA22C504E IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFC0000EB8DE39CF261EE2C7389B748F8B64327 -L = 16 Out = 6E9CACEB9D51D7D05E1FD06B1BE031C7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000EB8DE39CF261EE2C7389B748F8B64328 -L = 16 Out = 556ECC72A98D46912ADDD08FDE7BA0A3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000EB8DE39CF261EE2C7389B748F8B64329 -L = 16 Out = 3A404D891C30FBBA2EED516E81B82391 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFF8000EB8DE39CF261EE2C7389B748F8B6432A -L = 16 Out = 7BC825F8C9CB40A71E6B714171A77436 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFC000EB8DE39CF261EE2C7389B748F8B6432B -L = 16 Out = EC8430466E19133B11D9B99DA3C614B8 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000EB8DE39CF261EE2C7389B748F8B6432C -L = 16 Out = DCB6690389626F5392FD37E486490649 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000EB8DE39CF261EE2C7389B748F8B6432D -L = 16 Out = 73A591DF83E5F8E819BC63702471DD4A IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFF800EB8DE39CF261EE2C7389B748F8B6432E -L = 16 Out = 76B3B1D6EB12BBD6C3F17E73E9E2EB30 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC00EB8DE39CF261EE2C7389B748F8B6432F -L = 16 Out = FEC46BE2B11B2FA1C7D7A5CC3012F5DC IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00EB8DE39CF261EE2C7389B748F8B64330 -L = 16 Out = 393389AC2C7FBA821920F6DC2193A4E0 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00EB8DE39CF261EE2C7389B748F8B64331 -L = 16 Out = 43D7D429B793F150173FCFEC35D9A4E8 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF80EB8DE39CF261EE2C7389B748F8B64332 -L = 16 Out = 8EAE659DF12B19C428CFC37E3432683D IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0EB8DE39CF261EE2C7389B748F8B64333 -L = 16 Out = 5080B7459858EA77FFC5AEAD88DEE1B5 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0EB8DE39CF261EE2C7389B748F8B64334 -L = 16 Out = ACBEEAFC7D2C5DCE6AC63452E07D6A95 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0EB8DE39CF261EE2C7389B748F8B64335 -L = 16 Out = 95407BD82770032D496FD3F54478A589 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8EB8DE39CF261EE2C7389B748F8B64336 -L = 16 Out = F3B8D4093A4D2845A2C411C8EA1E9F12 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCEB8DE39CF261EE2C7389B748F8B64337 -L = 16 Out = 6B232AD852E9D6EB2CA54E8C9B5163C3 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEB8DE39CF261EE2C7389B748F8B64338 -L = 16 Out = C3CB4B5855323C13C8973982E9EA33E7 IKM = C592BF6A04D72BB1CBEAF590B7CCA6BCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB8DE39CF261EE2C7389B748F8B64339 -L = 16 Out = 504D101AC84F9B4542C1B0264B947410 -[X9.31-RNG(AES-192)] +[AES-192] IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163800000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C82 -L = 16 Out = 765F8B450404187233E6F7C30A9C3033 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163C00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C83 -L = 16 Out = 3636889C7E3720C3E0DCF399104597A4 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163E00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C84 -L = 16 Out = 2845D5BCACD8C65B5B4B5A168E778DF7 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163F00000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C85 -L = 16 Out = 41CDAA700F6E179354AD61B7CBD5E272 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163F80000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C86 -L = 16 Out = E08638EAEC7EA84B43AC7EB48296B94C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FC0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C87 -L = 16 Out = A7AFADA8824F5B94EB20E31B30519A91 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FE0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C88 -L = 16 Out = F5CAB3443DA2C48B0C309FC64FB903C6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FF0000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C89 -L = 16 Out = 6CCEBF22A49BB4921E4E30D0663F90DC IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FF8000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8A -L = 16 Out = D8CCE94DE9CFE74E3392418BCC843B14 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFC000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8B -L = 16 Out = D56EEA4E0B3963E370E6145352F170F0 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFE000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8C -L = 16 Out = 43894E0870AD99C2CF7116FF3F076AA3 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFF000000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8D -L = 16 Out = 0181C2495F3DDB5BBA9F52634A3CA1A1 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFF800000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8E -L = 16 Out = AE97729D2D864B54619DCCA39F7C1E3E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFC00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C8F -L = 16 Out = E7F674C418E2CF20CE7152BFD184428D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFE00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C90 -L = 16 Out = DA0CCB4303614FE6F975AAC0A6B79C0C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFF00000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C91 -L = 16 Out = 02AAAFF23E2D38885670604C1356CAFA IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFF80000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C92 -L = 16 Out = 649A70DFBEEBAFE24F102BB45302CA90 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFC0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C93 -L = 16 Out = 2E2CE97AD3E20C8F5E676D453FC0573A IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFE0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C94 -L = 16 Out = 147AA9D83747429EB9E642190331E140 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFF0000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C95 -L = 16 Out = CA64870FDF1A3DFD3206EC3C39E37831 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFF8000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C96 -L = 16 Out = 9D91BBFA64EC181C0FEA5B620338C93F IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFC000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C97 -L = 16 Out = DBF7E2FFD26CC3DE9E58F06EA4AA108B IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFE000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C98 -L = 16 Out = 172248D875492388F40E465884809BEC IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFF000000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C99 -L = 16 Out = 9CDDA74369BCE1E0545AC7BB33ED56C6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFF800000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9A -L = 16 Out = 58F86FD5A8CE9F2DE1D7B036646C3CF0 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFC00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9B -L = 16 Out = 22B087E72247F42628C4EED66DAC2857 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFE00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9C -L = 16 Out = 2C5A29C655986B70CF4D824DA14CCC51 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFF00000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9D -L = 16 Out = 166EA4679813A0BC390389EC305336FB IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFF80000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9E -L = 16 Out = BF11A059C4081554C66DA4BD62B20954 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFC0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0C9F -L = 16 Out = 566904C94E52FC620F980EDF352428CA IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFE0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA0 -L = 16 Out = DC3EFF7EAC7A8EBD840DF5F621A3449A IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFF0000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA1 -L = 16 Out = EADDA03E98C5B8A6A28C92B7EBC7AC97 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFF8000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA2 -L = 16 Out = 99F41647A63D58E862E3AC10FC5AEE92 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFC000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA3 -L = 16 Out = B5D386B2184EDFD9726DA021B0F34142 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFE000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA4 -L = 16 Out = FAAE880D0C2DADC2015C66BE8AD6BC1E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFF000000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA5 -L = 16 Out = 250DCFF45916E9F8FA2219F62A422B00 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFF800000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA6 -L = 16 Out = 853BAB572DCE44B910DDE9D74D6EC4A9 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFC00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA7 -L = 16 Out = EBFC3DFD08EE68B825F47F63F47FFC2D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFE00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA8 -L = 16 Out = 6D25021AE6865BC70971485E1888CB35 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFF00000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CA9 -L = 16 Out = A1D2584BBE712619CABD295ADE48D132 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFF80000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAA -L = 16 Out = 8EA62AAFD310009DE585FCA2542128C6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFC0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAB -L = 16 Out = 5DBEEB2438CDC2E4B0727F537EB6BCEE IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFE0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAC -L = 16 Out = 81A884DD17A78D57BB00FC23B372A003 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFF0000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAD -L = 16 Out = 22ECAAC6F2884CC9F2977C63A7F429AF IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFF8000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAE -L = 16 Out = 35A2E0D7BE633C0E24C09E6F7EB681A5 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFC000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CAF -L = 16 Out = FAA2B324614E430AF7168D3BE22AB8F5 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFE000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB0 -L = 16 Out = FEEB51786DA2CAD7C17EB084F16ED95C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFF000000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB1 -L = 16 Out = 60C5CC3D4FA90CAE8F800FE0EBC3BD7D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFF800000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB2 -L = 16 Out = F4F4B400DE91585909EC6C772A616331 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFC00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB3 -L = 16 Out = 10A1126BFCF62DE266240BEBC70345D4 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFE00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB4 -L = 16 Out = 7E54A01950089CECD54EF526C2CA4D32 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFF00000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB5 -L = 16 Out = 878880E754C0835B28EE7ABBAC5483BE IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFF80000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB6 -L = 16 Out = 5818CF8CCCF36E2FD381F40E8E6B6C22 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFC0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB7 -L = 16 Out = 5342E61C5CE89EFC82790297315BC6BE IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFE0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB8 -L = 16 Out = C1A6F265700B4B032B82A8DDECE58FA8 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFF0000000000000000008159E43DB66ECF3EABE5A44E0D4C0CB9 -L = 16 Out = 4206F2CBF9FBBC6CF774642B552754A6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFF8000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBA -L = 16 Out = 0839EF91752B19D1B4D853BF27945C98 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFC000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBB -L = 16 Out = 3AA99E43E643F56D51EAE0DD94D53FAD IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFE000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBC -L = 16 Out = 8A17C2B4992E26A7A0E709F05C3B81EC IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFF000000000000000008159E43DB66ECF3EABE5A44E0D4C0CBD -L = 16 Out = 9D14DA0A5F6D0E5F7B9FC38BBD598196 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFF800000000000000008159E43DB66ECF3EABE5A44E0D4C0CBE -L = 16 Out = 709CAED6B876ECE41FF7AE78C3892CAC IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFC00000000000000008159E43DB66ECF3EABE5A44E0D4C0CBF -L = 16 Out = 5AD091FF7C2677F8E3DFB98F8E85E54A IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFE00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC0 -L = 16 Out = 989D89F341AB464BE89E17B06467A8FD IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFF00000000000000008159E43DB66ECF3EABE5A44E0D4C0CC1 -L = 16 Out = 3257273E13063BCFB64C7A0B090B0A2D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFF80000000000000008159E43DB66ECF3EABE5A44E0D4C0CC2 -L = 16 Out = 431D551090D4E840432CD0D8E7170666 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFC0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC3 -L = 16 Out = F3EBF6C275C41C7015BFEE14DE87F372 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFE0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC4 -L = 16 Out = 13EE442069EC7B852034397B1F09EB3D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFF0000000000000008159E43DB66ECF3EABE5A44E0D4C0CC5 -L = 16 Out = ACFAA2C816C9ECAD0A19BA783BCAB411 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFF8000000000000008159E43DB66ECF3EABE5A44E0D4C0CC6 -L = 16 Out = 2AAEB898354B9E1358CA6DF57369C361 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFC000000000000008159E43DB66ECF3EABE5A44E0D4C0CC7 -L = 16 Out = 52C35276866C0DA1277FC4952B732EEA IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFE000000000000008159E43DB66ECF3EABE5A44E0D4C0CC8 -L = 16 Out = BAEEB093F380B5D887DC48B7DE672D33 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFF000000000000008159E43DB66ECF3EABE5A44E0D4C0CC9 -L = 16 Out = D524C38205AD436D54199E0F8E04D8D9 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFF800000000000008159E43DB66ECF3EABE5A44E0D4C0CCA -L = 16 Out = A0D1315745F15F0DDC468DBDD9E56714 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFC00000000000008159E43DB66ECF3EABE5A44E0D4C0CCB -L = 16 Out = 2776D4FFDFFB344EC55FC22FFE450A3C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFE00000000000008159E43DB66ECF3EABE5A44E0D4C0CCC -L = 16 Out = BC0716E00000562CC8A9E2470F3D8B63 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFF00000000000008159E43DB66ECF3EABE5A44E0D4C0CCD -L = 16 Out = E29DD29D73D883CD8DAF74838BBEFC7C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFF80000000000008159E43DB66ECF3EABE5A44E0D4C0CCE -L = 16 Out = 84CBCBB352E2D3CB77E04C954280694E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFC0000000000008159E43DB66ECF3EABE5A44E0D4C0CCF -L = 16 Out = 558744FEBFFE7A0AE424D45921B87309 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFE0000000000008159E43DB66ECF3EABE5A44E0D4C0CD0 -L = 16 Out = 7FF9325EA7576D41B4A1B557533432FB IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFF0000000000008159E43DB66ECF3EABE5A44E0D4C0CD1 -L = 16 Out = 01CC9B4887AD0B270EC55F6527AB90A6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFF8000000000008159E43DB66ECF3EABE5A44E0D4C0CD2 -L = 16 Out = 044176DA3370910AE0BCBDCF1D895CC0 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFC000000000008159E43DB66ECF3EABE5A44E0D4C0CD3 -L = 16 Out = BCA18B1630EAEC7CBDDF5C513A53D456 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFE000000000008159E43DB66ECF3EABE5A44E0D4C0CD4 -L = 16 Out = 19D1D3DA04BDAD8D710DD14A611F8F17 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFF000000000008159E43DB66ECF3EABE5A44E0D4C0CD5 -L = 16 Out = 615BC0AF497F862399EF275E649746F0 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFF800000000008159E43DB66ECF3EABE5A44E0D4C0CD6 -L = 16 Out = 58F46ACF8BB0D1B56EF0AD46D90DA340 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFC00000000008159E43DB66ECF3EABE5A44E0D4C0CD7 -L = 16 Out = 2F2DBE7F2123A2E66CD8DD478688A07E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFE00000000008159E43DB66ECF3EABE5A44E0D4C0CD8 -L = 16 Out = AA80B113C8E106723409B3F31969965A IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFF00000000008159E43DB66ECF3EABE5A44E0D4C0CD9 -L = 16 Out = DFC761136BCB3B2E1E13E0291BA85972 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFF80000000008159E43DB66ECF3EABE5A44E0D4C0CDA -L = 16 Out = E0944C42C6EE12FAA28286B0ED4F5DC7 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFC0000000008159E43DB66ECF3EABE5A44E0D4C0CDB -L = 16 Out = DAF99970E52C6639188262C5DAD13123 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFE0000000008159E43DB66ECF3EABE5A44E0D4C0CDC -L = 16 Out = 0E07202C26F31E74004015F6BC7E2100 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFF0000000008159E43DB66ECF3EABE5A44E0D4C0CDD -L = 16 Out = 93DCAC92FB0DA5976DF8A75DBDC61C9B IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFF8000000008159E43DB66ECF3EABE5A44E0D4C0CDE -L = 16 Out = 9370C5EC398DE376E319370A4C5F26E2 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFC000000008159E43DB66ECF3EABE5A44E0D4C0CDF -L = 16 Out = 83C03F2B1B64E72ED21D0A5F59FA7F8C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFE000000008159E43DB66ECF3EABE5A44E0D4C0CE0 -L = 16 Out = AA1159B23592ADECC168B2268952A92B IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFF000000008159E43DB66ECF3EABE5A44E0D4C0CE1 -L = 16 Out = 14EEE0E44CA217E45440EC84011D89A5 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFF800000008159E43DB66ECF3EABE5A44E0D4C0CE2 -L = 16 Out = B2C88BBA8B055BA74622297E8BC8D95D IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFC00000008159E43DB66ECF3EABE5A44E0D4C0CE3 -L = 16 Out = FADFBA23CC801A926A119F78B37A9307 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFE00000008159E43DB66ECF3EABE5A44E0D4C0CE4 -L = 16 Out = 4CB2D5484366D91C9243C4797DA983DD IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFF00000008159E43DB66ECF3EABE5A44E0D4C0CE5 -L = 16 Out = 367EF2BDC4163545C4C9011AE53755DE IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFF80000008159E43DB66ECF3EABE5A44E0D4C0CE6 -L = 16 Out = 51888B85AD78889BACEA726798C30C95 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFC0000008159E43DB66ECF3EABE5A44E0D4C0CE7 -L = 16 Out = 1D3CEC46E078E44BF11603DB2726D8F2 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFE0000008159E43DB66ECF3EABE5A44E0D4C0CE8 -L = 16 Out = A369189A3667F44FFA8DA2E5E9425D6F IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFF0000008159E43DB66ECF3EABE5A44E0D4C0CE9 -L = 16 Out = ED8C0F37154A57D27A9A11CAE3F3131E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFF8000008159E43DB66ECF3EABE5A44E0D4C0CEA -L = 16 Out = 8B04BF18036328006D9A7FC4C1BCF818 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFC000008159E43DB66ECF3EABE5A44E0D4C0CEB -L = 16 Out = 0E1E3F517E7502E4CC98A3A312692666 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFE000008159E43DB66ECF3EABE5A44E0D4C0CEC -L = 16 Out = 306CA0902C2B572BB5E2CE0848D6280E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFF000008159E43DB66ECF3EABE5A44E0D4C0CED -L = 16 Out = 8F8479252EF0C104D27B38C52F4F40EB IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFF800008159E43DB66ECF3EABE5A44E0D4C0CEE -L = 16 Out = D5C6F739A2B316B8CAFBC39999C731CB IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFC00008159E43DB66ECF3EABE5A44E0D4C0CEF -L = 16 Out = 5C153EA9F8580BE16B093EE1CF83529B IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFE00008159E43DB66ECF3EABE5A44E0D4C0CF0 -L = 16 Out = 13A3DF5F58736008E8101087B5B49563 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFF00008159E43DB66ECF3EABE5A44E0D4C0CF1 -L = 16 Out = 2CB0DC2125C33149703A9A86CB0FB7D2 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFF80008159E43DB66ECF3EABE5A44E0D4C0CF2 -L = 16 Out = 5453577F4F95E85D729DCFD84B297381 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFC0008159E43DB66ECF3EABE5A44E0D4C0CF3 -L = 16 Out = 588702C309F54A76467B8F587FE17096 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFE0008159E43DB66ECF3EABE5A44E0D4C0CF4 -L = 16 Out = 7779A89AD48BB3FD8BBFDC5BD8C9101E IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFF0008159E43DB66ECF3EABE5A44E0D4C0CF5 -L = 16 Out = 9EDB48F7416AE0BD9802172515AA3D80 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFF8008159E43DB66ECF3EABE5A44E0D4C0CF6 -L = 16 Out = 84AEA377BDDC54012F710254A435E1D1 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC008159E43DB66ECF3EABE5A44E0D4C0CF7 -L = 16 Out = 4BEE75DC775926F27373A958BF64A168 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE008159E43DB66ECF3EABE5A44E0D4C0CF8 -L = 16 Out = 76B563BA44BFF0D9CB460CD5E8D55C32 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF008159E43DB66ECF3EABE5A44E0D4C0CF9 -L = 16 Out = 0682EA4560113BE4D3F3E92256D2BAAC IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF808159E43DB66ECF3EABE5A44E0D4C0CFA -L = 16 Out = 65D98A2BC1A84569FC553ED36C28FF45 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC08159E43DB66ECF3EABE5A44E0D4C0CFB -L = 16 Out = 0AABEB6CE77559F813C8257E57938C2C IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE08159E43DB66ECF3EABE5A44E0D4C0CFC -L = 16 Out = 5ED815849F9F2480202FDAE7C05CC83B IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF08159E43DB66ECF3EABE5A44E0D4C0CFD -L = 16 Out = 5F453DBC5FED77520B0AFB71DAE3C083 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88159E43DB66ECF3EABE5A44E0D4C0CFE -L = 16 Out = 14CAA4D84D923CCDAD2CD1CCD0377833 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC8159E43DB66ECF3EABE5A44E0D4C0CFF -L = 16 Out = 573691CD8E310DC33A645582BA51DE9A IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE8159E43DB66ECF3EABE5A44E0D4C0D00 -L = 16 Out = 8B77DFB1C9BD1FBF4B379B159230A7A6 IKM = E8BF7880FD391D95F3F83B700422E91B22ACDEC4D2D9E163FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8159E43DB66ECF3EABE5A44E0D4C0D01 -L = 16 Out = CCAE97D6E56FBDA46C9B0DF5B6AF71C3 -[X9.31-RNG(AES-256)] +[AES-256] IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D468000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C2 -L = 16 Out = 6C5EE8D10201D608874E6AE8C8A2BA79 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46C000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C3 -L = 16 Out = 3790A9D44DE68EF0800837B32E2ED032 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46E000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C4 -L = 16 Out = 72A1742C79E8B1D4F62E0669657F744D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46F000000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C5 -L = 16 Out = 9E5708E79B379B9D393C766CFD802C98 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46F800000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C6 -L = 16 Out = AF7A0A13DE0B16512986538D5FECDC7D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FC00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C7 -L = 16 Out = D885CBF7B4E38B9FAC1C8EB625DDABCA IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FE00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C8 -L = 16 Out = 7AEF038A328D1827D52DA4A36567C7BA IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FF00000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666C9 -L = 16 Out = 14169D5DE6E79DEA20E261DA55DBA593 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FF80000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CA -L = 16 Out = DFE31312A96369CF41CAED493D4DFF4B IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFC0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CB -L = 16 Out = BAFFD64502B19D26DCA93D09E43D8036 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFE0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CC -L = 16 Out = 8BDEF0F95AB8F3B5A591A78364B723C7 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFF0000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CD -L = 16 Out = 38145A8F807E13CB05B2810E752BABDE IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFF8000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CE -L = 16 Out = 98EA671222B7332AEA395F37A355B1CC IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFC000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666CF -L = 16 Out = 20C8AB02049C9987A7B00B4498B2C6E3 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFE000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D0 -L = 16 Out = 67B8ACDE366BD5D064CB53C09EB0A95A IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFF000000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D1 -L = 16 Out = 137721E4A673550141E2E3CF652A0819 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFF800000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D2 -L = 16 Out = 29C0369E50A4B5494166E60E7E394149 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFC00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D3 -L = 16 Out = 09FAA6F94FE3DAFE3E10A38D8B9ABDE4 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFE00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D4 -L = 16 Out = 5F976E965ABC8C93D1C175AA750C16DC IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFF00000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D5 -L = 16 Out = 25C386A980D1E75632566AD290FE3333 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFF80000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D6 -L = 16 Out = D0CB44688ADA0966204B3D53FA89D534 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFC0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D7 -L = 16 Out = D2D11DD6ABE3B30BAECAADE50A2E9642 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFE0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D8 -L = 16 Out = 068451BECF49C9AD8BF47F176B154092 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFF0000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666D9 -L = 16 Out = A8B505B0B75D061A1111FF97EE70CB2D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFF8000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DA -L = 16 Out = 0479DBD05E14286F769AD495AE114D56 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFC000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DB -L = 16 Out = 9C62B0A336593C307F2144658DA20BA2 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFE000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DC -L = 16 Out = D68EFECC5CA3C1109769F14288202779 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFF000000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DD -L = 16 Out = DE6A7F99826A4F60BD70A2839B269A39 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFF800000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DE -L = 16 Out = F03D08EDF438E946E056B6D085C27B28 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFC00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666DF -L = 16 Out = 4DB84EFD6F81DC4B70CAB3E365C70B21 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFE00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E0 -L = 16 Out = 2D78FEC4CA1917B5070D4B5246D5CD11 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFF00000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E1 -L = 16 Out = CE9228E22BD9E7A39FF05E194805F730 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFF80000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E2 -L = 16 Out = D8912B41584C29C70874CBB947833B38 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFC0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E3 -L = 16 Out = 83644C0D80557650F719DF1B28A0CB3F IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFE0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E4 -L = 16 Out = 032A88989BB02C57501CC05D4D72E8A1 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFF0000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E5 -L = 16 Out = 7C3607B5F5193A51DF18A19CF4577795 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFF8000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E6 -L = 16 Out = 76B055658ADF07D15422895951F692E0 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFC000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E7 -L = 16 Out = 7F87F363569F479DA806ABF988002705 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFE000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E8 -L = 16 Out = 9A830D8126A8D39BA023B4F545670618 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFF000000000000000000000097B45F0EE0FB64AC3B8A1B9B750666E9 -L = 16 Out = 7C0907F8FEBC6DCF1A4D83D420E5DC85 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFF800000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EA -L = 16 Out = F84F6500F554CAF20FF785C28E70AA69 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFC00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EB -L = 16 Out = 876052A291745E5479FD0ADB65AB3CFD IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFE00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EC -L = 16 Out = 69F6A409470573A5DEB23744A9FE8C26 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFF00000000000000000000097B45F0EE0FB64AC3B8A1B9B750666ED -L = 16 Out = 455FF206B8BA6D99DDA0B0E645DD03A0 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFF80000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EE -L = 16 Out = A82E4437632E216EA6E5F75AEB6DC148 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFC0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666EF -L = 16 Out = A7B1E69A85CC0E01CD2F59E7AFAF790F IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFE0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F0 -L = 16 Out = 68FFCB667FCD6113A1B3E6F20ADBADFE IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFF0000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F1 -L = 16 Out = CEE4E4C331CE6AF61D07617079420E4E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFF8000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F2 -L = 16 Out = E7CFD60A04AE3875F6E460FE73FC151E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFC000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F3 -L = 16 Out = 301E3DA5BD96188B3154AAC685EB8B6F IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFE000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F4 -L = 16 Out = 12588D677D871E4B042F16E98693167F IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFF000000000000000000097B45F0EE0FB64AC3B8A1B9B750666F5 -L = 16 Out = 938DF998D725B8EF5363C99A82D447F8 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFF800000000000000000097B45F0EE0FB64AC3B8A1B9B750666F6 -L = 16 Out = 6588A7E9B2D3F82BEACB086A24F05730 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFC00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F7 -L = 16 Out = CA0BBDDD004301639B1644A8CB9360B2 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFE00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F8 -L = 16 Out = 35B609CE89EE33F267A4E875FA4128F3 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFF00000000000000000097B45F0EE0FB64AC3B8A1B9B750666F9 -L = 16 Out = BAC817B7C3E5B617FFC977F23BBF755B IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFF80000000000000000097B45F0EE0FB64AC3B8A1B9B750666FA -L = 16 Out = 46487C6F7B5EEDCDAB5BB08234EE4C76 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFC0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FB -L = 16 Out = 752D69F5FFAAB3D22A07B5E8CC02C7DA IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFE0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FC -L = 16 Out = 46688ED5C008A8431D25FECADCAC511E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFF0000000000000000097B45F0EE0FB64AC3B8A1B9B750666FD -L = 16 Out = 2A5BCBE76FE95C1274F4B9315D4286CE IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFF8000000000000000097B45F0EE0FB64AC3B8A1B9B750666FE -L = 16 Out = C9BD29164997EB53E05D41B4A5654AE8 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFC000000000000000097B45F0EE0FB64AC3B8A1B9B750666FF -L = 16 Out = EB5C8D67F1B7A2183A0B196E8450B873 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFE000000000000000097B45F0EE0FB64AC3B8A1B9B75066700 -L = 16 Out = CD9231AF1BB1CA82226F5C5852BA17C2 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFF000000000000000097B45F0EE0FB64AC3B8A1B9B75066701 -L = 16 Out = 5C0DA74392E5BE679DBD40FC95EE03D4 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFF800000000000000097B45F0EE0FB64AC3B8A1B9B75066702 -L = 16 Out = 786D6BA1C0BA6FC1AF0F11EC5875A1F5 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFC00000000000000097B45F0EE0FB64AC3B8A1B9B75066703 -L = 16 Out = 1F251DD8210AAEDCB79D4152369CD76B IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFE00000000000000097B45F0EE0FB64AC3B8A1B9B75066704 -L = 16 Out = 1B291C0DBDB2075E9B9C709A15016ED7 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFF00000000000000097B45F0EE0FB64AC3B8A1B9B75066705 -L = 16 Out = 8465C72B7319CD4D0E35A05D49C5508D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFF80000000000000097B45F0EE0FB64AC3B8A1B9B75066706 -L = 16 Out = 07F04A0749B6DE3B5C668729B28AFB54 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFC0000000000000097B45F0EE0FB64AC3B8A1B9B75066707 -L = 16 Out = 6C97CB048F5B4E7C32196C14E678A0E1 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFE0000000000000097B45F0EE0FB64AC3B8A1B9B75066708 -L = 16 Out = BE029441D7AF7EE8CE7310F6F5006809 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFF0000000000000097B45F0EE0FB64AC3B8A1B9B75066709 -L = 16 Out = 31074BC8D063E87E2FF1F9E0EAA404D9 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFF8000000000000097B45F0EE0FB64AC3B8A1B9B7506670A -L = 16 Out = 37A677D029773FE867F07020F65F0246 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFC000000000000097B45F0EE0FB64AC3B8A1B9B7506670B -L = 16 Out = 89DF0BD0FA7D852EAC6B564AB8E6F3F3 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFE000000000000097B45F0EE0FB64AC3B8A1B9B7506670C -L = 16 Out = CA7747BEFE61CFA622F7A821116E43C2 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFF000000000000097B45F0EE0FB64AC3B8A1B9B7506670D -L = 16 Out = 82D1BA96DF72AC93CD57E9234509FB08 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFF800000000000097B45F0EE0FB64AC3B8A1B9B7506670E -L = 16 Out = 299ECF7AAFADB0F2B21812B8B2977470 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFC00000000000097B45F0EE0FB64AC3B8A1B9B7506670F -L = 16 Out = 7A7A2015F797F943F75F70994F43E523 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFE00000000000097B45F0EE0FB64AC3B8A1B9B75066710 -L = 16 Out = 88F208943716B38D25EC02E164357DBF IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFF00000000000097B45F0EE0FB64AC3B8A1B9B75066711 -L = 16 Out = 2420712BC5A2187E71436DF0C7D9E5D7 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFF80000000000097B45F0EE0FB64AC3B8A1B9B75066712 -L = 16 Out = A95EC3F73418436AD057F861BBC1811C IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFC0000000000097B45F0EE0FB64AC3B8A1B9B75066713 -L = 16 Out = 713E1A0B1C56DD8D219921C8FEB462EF IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFE0000000000097B45F0EE0FB64AC3B8A1B9B75066714 -L = 16 Out = B5AA2282CC8D2F0003A6492CDE8BD888 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFF0000000000097B45F0EE0FB64AC3B8A1B9B75066715 -L = 16 Out = BD38241AF3C4E5CC844CED745CF65B7D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFF8000000000097B45F0EE0FB64AC3B8A1B9B75066716 -L = 16 Out = D6DF902987B9C3D5826BA71F1A5FA271 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFC000000000097B45F0EE0FB64AC3B8A1B9B75066717 -L = 16 Out = DCD0CA7E3C0422E4723AE53641DF1E47 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFE000000000097B45F0EE0FB64AC3B8A1B9B75066718 -L = 16 Out = 757E483E335672145C0C0C2097DACDA5 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFF000000000097B45F0EE0FB64AC3B8A1B9B75066719 -L = 16 Out = 3BAE296E2434A5331383085CC7704988 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFF800000000097B45F0EE0FB64AC3B8A1B9B7506671A -L = 16 Out = F2CE3B5AA3DCCAF64722D1AE10DE005E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFC00000000097B45F0EE0FB64AC3B8A1B9B7506671B -L = 16 Out = 58DEC1DEF6FD5E09D814AE6F8641A219 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFE00000000097B45F0EE0FB64AC3B8A1B9B7506671C -L = 16 Out = 2F28B31722EE508F8679234F458BDA26 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFF00000000097B45F0EE0FB64AC3B8A1B9B7506671D -L = 16 Out = B89DE1B9E3937F115EEE36CE1C1BDD74 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFF80000000097B45F0EE0FB64AC3B8A1B9B7506671E -L = 16 Out = B6B987E6C49B5BC452F97991838DDCEB IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFC0000000097B45F0EE0FB64AC3B8A1B9B7506671F -L = 16 Out = E363D02F055C097BF19CD491654FF798 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFE0000000097B45F0EE0FB64AC3B8A1B9B75066720 -L = 16 Out = 654A5415175E6343672AE4C63D6643A2 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFF0000000097B45F0EE0FB64AC3B8A1B9B75066721 -L = 16 Out = ED2313EFC077667BD26DB08F581F3C74 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFF8000000097B45F0EE0FB64AC3B8A1B9B75066722 -L = 16 Out = FC6348FC174F45C96F5A3C78C13B220B IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFC000000097B45F0EE0FB64AC3B8A1B9B75066723 -L = 16 Out = 65AEDCD56236E056217C94642BFEF8BC IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFE000000097B45F0EE0FB64AC3B8A1B9B75066724 -L = 16 Out = 920A3A154BD41CB775BA25C2EB3A6885 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFF000000097B45F0EE0FB64AC3B8A1B9B75066725 -L = 16 Out = 07953BBE0BE803D75E3B8A0EDBEF1D36 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFF800000097B45F0EE0FB64AC3B8A1B9B75066726 -L = 16 Out = A0BCB7A68C7C29E13306E5BD11AD6746 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFC00000097B45F0EE0FB64AC3B8A1B9B75066727 -L = 16 Out = 6DEB2CEA2F4AC6AADB7D3A22A3DA0B65 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFE00000097B45F0EE0FB64AC3B8A1B9B75066728 -L = 16 Out = 9D70BC79E81D6279EDCBEFD2C0EF1C5D IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFF00000097B45F0EE0FB64AC3B8A1B9B75066729 -L = 16 Out = AEF03890D852369F48651CF873E30710 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFF80000097B45F0EE0FB64AC3B8A1B9B7506672A -L = 16 Out = F189987D9AA73395765EF29A72B8B058 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFC0000097B45F0EE0FB64AC3B8A1B9B7506672B -L = 16 Out = 87F833C8D5200898FF3B6BDD0B869F94 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFE0000097B45F0EE0FB64AC3B8A1B9B7506672C -L = 16 Out = 5A7B8BB4F19D6DAC3AB19C2F9E2C65DA IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFF0000097B45F0EE0FB64AC3B8A1B9B7506672D -L = 16 Out = CBDBA79302A31040BEB82623B832DF92 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFF8000097B45F0EE0FB64AC3B8A1B9B7506672E -L = 16 Out = 38E92CC8333025DC803CE15A2628E34A IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFC000097B45F0EE0FB64AC3B8A1B9B7506672F -L = 16 Out = FB033A85B5CD43564D80C0280D70B92F IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFE000097B45F0EE0FB64AC3B8A1B9B75066730 -L = 16 Out = 21EC2A86B6A717DB2A3FC7F1DFF2ECEB IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFF000097B45F0EE0FB64AC3B8A1B9B75066731 -L = 16 Out = 7DDECD08BA8101F3CD61C42C33B987A7 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFF800097B45F0EE0FB64AC3B8A1B9B75066732 -L = 16 Out = 784E688C7D87FC3C9D31B2B45885DB6E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFC00097B45F0EE0FB64AC3B8A1B9B75066733 -L = 16 Out = 08610008A6FF151C4DD5DE24D578A284 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFE00097B45F0EE0FB64AC3B8A1B9B75066734 -L = 16 Out = 91F83EC50CE5A5885659D15A3A50FF3E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFF00097B45F0EE0FB64AC3B8A1B9B75066735 -L = 16 Out = B4CE519B707EA0791AF63F4344207CB4 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFF80097B45F0EE0FB64AC3B8A1B9B75066736 -L = 16 Out = 94D92918083BF232F8D6580E6A0DEF10 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFC0097B45F0EE0FB64AC3B8A1B9B75066737 -L = 16 Out = F62EE1B2DB6D84D57BEFC1C99C7F4B60 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0097B45F0EE0FB64AC3B8A1B9B75066738 -L = 16 Out = 5E4B8514D4CDFDD77796B3ED0E310AFE IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0097B45F0EE0FB64AC3B8A1B9B75066739 -L = 16 Out = 3175BBBFE5ED208D189E6B25ADEEB78B IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8097B45F0EE0FB64AC3B8A1B9B7506673A -L = 16 Out = 5AC67D25AA2BEFA746FCD6B3FF5BE1DA IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC097B45F0EE0FB64AC3B8A1B9B7506673B -L = 16 Out = 6842AA6307CC06A719828A0039FFC800 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE097B45F0EE0FB64AC3B8A1B9B7506673C -L = 16 Out = 664C66BDE4DEA06C4A79E2EC36DBA148 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF097B45F0EE0FB64AC3B8A1B9B7506673D -L = 16 Out = F14CE6B410049F5601E8426C4DBAB6F8 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF897B45F0EE0FB64AC3B8A1B9B7506673E -L = 16 Out = 262051DCA403EFBABE2B6BD45C9952D5 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC97B45F0EE0FB64AC3B8A1B9B7506673F -L = 16 Out = 4B4D035F1419C491D8FB486510EA97D8 IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE97B45F0EE0FB64AC3B8A1B9B75066740 -L = 16 Out = 152AF024DA001782BFEB875224F2622E IKM = A53E052EA80A62133EB26B3372A71EA2CCDDF10E1A7CB80B6FD9C8A86DA45D46FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF97B45F0EE0FB64AC3B8A1B9B75066741 -L = 16 Out = 8D7040135B3F89F28277A2527111CF36 [X9.31-RNG(TripleDES)] IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF768000000000000000F03E2147D5D7BC7F -L = 8 Out = 667BC708CC798ABE IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76C000000000000000F03E2147D5D7BC80 -L = 8 Out = E721EE3C0A2D3886 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76E000000000000000F03E2147D5D7BC81 -L = 8 Out = CB0FA40E1752F8B4 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76F000000000000000F03E2147D5D7BC82 -L = 8 Out = DF0351A5B44144A8 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76F800000000000000F03E2147D5D7BC83 -L = 8 Out = 2110E29B7345A88D IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FC00000000000000F03E2147D5D7BC84 -L = 8 Out = 78B751774AF554FB IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FE00000000000000F03E2147D5D7BC85 -L = 8 Out = E6BC50D6F128D30B IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FF00000000000000F03E2147D5D7BC86 -L = 8 Out = 6B7A3116248AE121 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FF80000000000000F03E2147D5D7BC87 -L = 8 Out = B9B973F5CFA262BD IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFC0000000000000F03E2147D5D7BC88 -L = 8 Out = CF0A02808E4416F5 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFE0000000000000F03E2147D5D7BC89 -L = 8 Out = 57AAA1031665A0F6 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFF0000000000000F03E2147D5D7BC8A -L = 8 Out = C5DA694741C400B8 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFF8000000000000F03E2147D5D7BC8B -L = 8 Out = 827985C4BEED13AD IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFC000000000000F03E2147D5D7BC8C -L = 8 Out = 4C959F98D557367B IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFE000000000000F03E2147D5D7BC8D -L = 8 Out = FEB783CEC07F19E0 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFF000000000000F03E2147D5D7BC8E -L = 8 Out = B2729B4BC2D30E9A IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFF800000000000F03E2147D5D7BC8F -L = 8 Out = 09F52DED6D12850F IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFC00000000000F03E2147D5D7BC90 -L = 8 Out = 84255B4BEA0AD20E IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFE00000000000F03E2147D5D7BC91 -L = 8 Out = D85EC40C40BCA823 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFF00000000000F03E2147D5D7BC92 -L = 8 Out = 66E000E798487EDB IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFF80000000000F03E2147D5D7BC93 -L = 8 Out = DA51E314770DC073 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFC0000000000F03E2147D5D7BC94 -L = 8 Out = 3C9876ABFCD744E1 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFE0000000000F03E2147D5D7BC95 -L = 8 Out = 35C48069FB403A05 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFF0000000000F03E2147D5D7BC96 -L = 8 Out = 167E7A420F8CE115 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFF8000000000F03E2147D5D7BC97 -L = 8 Out = 3F5F4A0BA480A18B IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFC000000000F03E2147D5D7BC98 -L = 8 Out = F8A5AB2EFFBE6588 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFE000000000F03E2147D5D7BC99 -L = 8 Out = 49D255DCA42D2980 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFF000000000F03E2147D5D7BC9A -L = 8 Out = 01FD7EA6AC37D847 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFF800000000F03E2147D5D7BC9B -L = 8 Out = 94A77C76071734A9 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFC00000000F03E2147D5D7BC9C -L = 8 Out = BF7E82A8F9ACEE71 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFE00000000F03E2147D5D7BC9D -L = 8 Out = F7CD2DB61C062B70 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFF00000000F03E2147D5D7BC9E -L = 8 Out = 5D5FC3205EA443CB IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFF80000000F03E2147D5D7BC9F -L = 8 Out = 177BA1ABE977A3BC IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFC0000000F03E2147D5D7BCA0 -L = 8 Out = A216FB8EBB474E43 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFE0000000F03E2147D5D7BCA1 -L = 8 Out = EC01B37568C1C8E6 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFF0000000F03E2147D5D7BCA2 -L = 8 Out = 5C99E5EC34992209 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFF8000000F03E2147D5D7BCA3 -L = 8 Out = 7CA695FA30B7274C IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFC000000F03E2147D5D7BCA4 -L = 8 Out = C4FEE5C7491D331A IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFE000000F03E2147D5D7BCA5 -L = 8 Out = E478C7F21574449D IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFF000000F03E2147D5D7BCA6 -L = 8 Out = A11D4FBD732DFD01 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFF800000F03E2147D5D7BCA7 -L = 8 Out = 2C44DD477C786C0D IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFC00000F03E2147D5D7BCA8 -L = 8 Out = 850D5D9DA85BC0FF IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFE00000F03E2147D5D7BCA9 -L = 8 Out = A3A6DDB46772D1B1 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFF00000F03E2147D5D7BCAA -L = 8 Out = 97FF98957CF38B00 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFF80000F03E2147D5D7BCAB -L = 8 Out = BC9E368D91CD2271 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFC0000F03E2147D5D7BCAC -L = 8 Out = 6B47A38A2BBDD3C8 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFE0000F03E2147D5D7BCAD -L = 8 Out = 123A41498F2F64E0 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFF0000F03E2147D5D7BCAE -L = 8 Out = 7362426810CB6EAF IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFF8000F03E2147D5D7BCAF -L = 8 Out = 42FB3B0EC5DBC02C IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFC000F03E2147D5D7BCB0 -L = 8 Out = B7524AB40D565D49 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFE000F03E2147D5D7BCB1 -L = 8 Out = 811C84CD8E223FB5 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFF000F03E2147D5D7BCB2 -L = 8 Out = 16DDAFC9DBA1194D IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFF800F03E2147D5D7BCB3 -L = 8 Out = 390B6AB9069DC5B4 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFC00F03E2147D5D7BCB4 -L = 8 Out = 009F167DC8664555 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFE00F03E2147D5D7BCB5 -L = 8 Out = 47645D90B39B319F IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFF00F03E2147D5D7BCB6 -L = 8 Out = D75CEC7FBA2064DF IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFF80F03E2147D5D7BCB7 -L = 8 Out = F59DDE3C02AD7C11 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFC0F03E2147D5D7BCB8 -L = 8 Out = 35AC2155446CCE9F IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFE0F03E2147D5D7BCB9 -L = 8 Out = 1DFEBF13320F7758 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFF0F03E2147D5D7BCBA -L = 8 Out = 017CA3327FC53831 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFF8F03E2147D5D7BCBB -L = 8 Out = 999A450B6E2040B9 IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFFCF03E2147D5D7BCBC -L = 8 Out = 49C1CAAC8C229EDE IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFFEF03E2147D5D7BCBD -L = 8 Out = 2C9D8D0F5D014F7B IKM = E92C8F13F897BF76193DF2DAAB98DF49E92C8F13F897BF76FFFFFFFFFFFFFFFFF03E2147D5D7BCBE -L = 8 Out = 16D7C77223C2FAED IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5E80000000000000000167E25F4EBC7336 -L = 8 Out = 4AACAD89C236FA2B IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EC0000000000000000167E25F4EBC7337 -L = 8 Out = A255A79AAB2211BA IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EE0000000000000000167E25F4EBC7338 -L = 8 Out = 061EFE779DAB818D IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EF0000000000000000167E25F4EBC7339 -L = 8 Out = 23214F0B19BF16B4 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EF8000000000000000167E25F4EBC733A -L = 8 Out = 52D38F9D53B530AF IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFC000000000000000167E25F4EBC733B -L = 8 Out = B9F4BA694FE9BC3E IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFE000000000000000167E25F4EBC733C -L = 8 Out = 2384398BBFBD3010 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFF000000000000000167E25F4EBC733D -L = 8 Out = D33ECF451E367919 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFF800000000000000167E25F4EBC733E -L = 8 Out = FAA94CA00765794C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFC00000000000000167E25F4EBC733F -L = 8 Out = 14C1303AAEE1B314 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFE00000000000000167E25F4EBC7340 -L = 8 Out = DC3A4F07DC68AC93 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFF00000000000000167E25F4EBC7341 -L = 8 Out = A4872C92A093B379 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFF80000000000000167E25F4EBC7342 -L = 8 Out = 3EE74CDFFBEED032 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFC0000000000000167E25F4EBC7343 -L = 8 Out = 328FD9C77EDC78BA IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFE0000000000000167E25F4EBC7344 -L = 8 Out = A5D36BD81D93CB71 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFF0000000000000167E25F4EBC7345 -L = 8 Out = D0765A50A9CAE3ED IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFF8000000000000167E25F4EBC7346 -L = 8 Out = 15F3441B4AC4F802 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFC000000000000167E25F4EBC7347 -L = 8 Out = 01463E8F161851C2 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFE000000000000167E25F4EBC7348 -L = 8 Out = 312E7CB57F08CBC2 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFF000000000000167E25F4EBC7349 -L = 8 Out = D9688FEF358FE5DF IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFF800000000000167E25F4EBC734A -L = 8 Out = 30B34034C46E22B5 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFC00000000000167E25F4EBC734B -L = 8 Out = A7CA7218CA7D5F9D IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFE00000000000167E25F4EBC734C -L = 8 Out = CE41C7659B6BFDA3 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFF00000000000167E25F4EBC734D -L = 8 Out = B8EED0C6DFB8B76B IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFF80000000000167E25F4EBC734E -L = 8 Out = A0C514277C70278A IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFC0000000000167E25F4EBC734F -L = 8 Out = 7A8F57670E11D5D8 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFE0000000000167E25F4EBC7350 -L = 8 Out = 35AF5134EC18E0FC IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFF0000000000167E25F4EBC7351 -L = 8 Out = 3034436B0E8B1B4D IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFF8000000000167E25F4EBC7352 -L = 8 Out = B1DC17DE141AD9EC IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFC000000000167E25F4EBC7353 -L = 8 Out = 40D2868DCF3BDA80 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFE000000000167E25F4EBC7354 -L = 8 Out = D3F365825B585FF6 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFF000000000167E25F4EBC7355 -L = 8 Out = 952046F8E93A268A IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFF800000000167E25F4EBC7356 -L = 8 Out = 97D96E48A9216264 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFC00000000167E25F4EBC7357 -L = 8 Out = DBEE3AD97B87915C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFE00000000167E25F4EBC7358 -L = 8 Out = 94093248683E084F IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFF00000000167E25F4EBC7359 -L = 8 Out = 3133C57CE22A28AB IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFF80000000167E25F4EBC735A -L = 8 Out = B32CC354449589E1 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFC0000000167E25F4EBC735B -L = 8 Out = 979F03CF867FDA3C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFE0000000167E25F4EBC735C -L = 8 Out = 6BFECB79437E62F4 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFF0000000167E25F4EBC735D -L = 8 Out = BAFB5D5B9BE92EEC IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFF8000000167E25F4EBC735E -L = 8 Out = D4FB2CAF0F114F42 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFC000000167E25F4EBC735F -L = 8 Out = 3F910FDBC4C74698 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFE000000167E25F4EBC7360 -L = 8 Out = 516D7E7739908FED IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFF000000167E25F4EBC7361 -L = 8 Out = 50DE403CB1FB1733 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFF800000167E25F4EBC7362 -L = 8 Out = 1A91443B2892FE8C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFC00000167E25F4EBC7363 -L = 8 Out = F3A490F9FE853450 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFE00000167E25F4EBC7364 -L = 8 Out = B7F8398C9D32149C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFF00000167E25F4EBC7365 -L = 8 Out = 179C6729EBDE6A46 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFF80000167E25F4EBC7366 -L = 8 Out = 34520C49E68D307B IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFC0000167E25F4EBC7367 -L = 8 Out = B6C2F4E4763DF833 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFE0000167E25F4EBC7368 -L = 8 Out = F911A2AB5E1F0E49 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFF0000167E25F4EBC7369 -L = 8 Out = 307C3C11DF3EE8EA IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFF8000167E25F4EBC736A -L = 8 Out = C26A5A02596BFE8D IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFC000167E25F4EBC736B -L = 8 Out = B44B68C5BE17352C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFE000167E25F4EBC736C -L = 8 Out = 3779CEB11398375F IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFF000167E25F4EBC736D -L = 8 Out = 7A9EF507F43BD31C IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFF800167E25F4EBC736E -L = 8 Out = 85CD4D72D2664C70 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFC00167E25F4EBC736F -L = 8 Out = 9EB57EACAB2B38C8 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFE00167E25F4EBC7370 -L = 8 Out = E521B274CC7EC06F IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFF00167E25F4EBC7371 -L = 8 Out = 50148A63F3D39097 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFF80167E25F4EBC7372 -L = 8 Out = 6DCE0D8E770CF809 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFFC0167E25F4EBC7373 -L = 8 Out = CAF9334B5A606C31 IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFFE0167E25F4EBC7374 -L = 8 Out = 1088488A43D9ACAD IKM = 5E5B890B133B345494AB15F75EB30757972667C862C4BF5EFFFFFFFFFFFFFFFF0167E25F4EBC7375 -L = 8 Out = F922C4B2357E9034 diff --git a/src/tests/main.cpp b/src/tests/main.cpp index c15fab438..07aaac519 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -15,8 +15,8 @@ #include <future> #include <botan/version.h> -#include <botan/auto_rng.h> #include <botan/loadstor.h> +#include <botan/hash.h> #if defined(BOTAN_HAS_HMAC_DRBG) #include <botan/hmac_drbg.h> @@ -26,12 +26,16 @@ #include <botan/system_rng.h> #endif +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif + namespace { class Test_Runner : public Botan_CLI::Command { public: - Test_Runner() : Command("test --threads=0 --soak=5 --drbg-seed= --data-dir= --log-success *suites") {} + Test_Runner() : Command("test --threads=0 --soak=5 --drbg-seed= --data-dir= --pkcs11-lib= --log-success *suites") {} std::string help_text() const override { @@ -73,6 +77,7 @@ class Test_Runner : public Botan_CLI::Command const std::string drbg_seed = get_arg("drbg-seed"); const bool log_success = flag_set("log-success"); const std::string data_dir = get_arg_or("data-dir", "src/tests/data"); + const std::string pkcs11_lib = get_arg("pkcs11-lib"); std::vector<std::string> req = get_arg_list("suites"); @@ -88,6 +93,19 @@ class Test_Runner : public Botan_CLI::Command std::set<std::string> all_others = Botan_Tests::Test::registered_tests(); + // do not run pkcs11 tests by default + for(std::set<std::string>::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); @@ -95,6 +113,11 @@ class Test_Runner : public Botan_CLI::Command 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"}; + } output() << "Testing " << Botan::version_string() << "\n"; output() << "Starting tests"; @@ -104,6 +127,11 @@ class Test_Runner : public Botan_CLI::Command output() << " soak level:" << soak_level; + if(! pkcs11_lib.empty()) + { + output() << " pkcs11 library:" << pkcs11_lib; + } + std::unique_ptr<Botan::RandomNumberGenerator> rng; #if defined(BOTAN_HAS_HMAC_DRBG) && defined(BOTAN_HAS_SHA2_64) @@ -116,8 +144,16 @@ class Test_Runner : public Botan_CLI::Command } output() << " rng:HMAC_DRBG with seed '" << Botan::hex_encode(seed) << "'"; - rng.reset(new Botan::Serialized_RNG(new Botan::HMAC_DRBG("HMAC(SHA-384)"))); - rng->add_entropy(seed.data(), seed.size()); + + // Expand out the seed to 512 bits to make the DRBG happy + std::unique_ptr<Botan::HashFunction> sha512(Botan::HashFunction::create("SHA-512")); + sha512->update(seed); + seed.resize(sha512->output_length()); + sha512->final(seed.data()); + + std::unique_ptr<Botan::HMAC_DRBG> drbg(new Botan::HMAC_DRBG("SHA-384")); + drbg->initialize_with(seed.data(), seed.size()); + rng.reset(new Botan::Serialized_RNG(drbg.release())); #else @@ -127,17 +163,20 @@ class Test_Runner : public Botan_CLI::Command #if defined(BOTAN_HAS_SYSTEM_RNG) output() << " rng:system"; rng.reset(new Botan::System_RNG); -#else - // AutoSeeded_RNG always available +#elif defined(BOTAN_HAS_AUTO_SEEDING_RNG) output() << " rng:autoseeded"; rng.reset(new Botan::Serialized_RNG(new Botan::AutoSeeded_RNG)); #endif #endif - output() << "\n"; - Botan_Tests::Test::setup_tests(soak_level, log_success, data_dir, rng.get()); + if(rng.get() == nullptr) + { + throw Botan_Tests::Test_Error("No usable RNG enabled in build, aborting tests"); + } + + Botan_Tests::Test::setup_tests(soak_level, log_success, data_dir, pkcs11_lib, rng.get()); const size_t failed = run_tests(req, output(), threads); diff --git a/src/tests/test_bigint.cpp b/src/tests/test_bigint.cpp index 95ce8be08..cee7b5b8b 100644 --- a/src/tests/test_bigint.cpp +++ b/src/tests/test_bigint.cpp @@ -10,6 +10,7 @@ #include <botan/bigint.h> #include <botan/numthry.h> #include <botan/reducer.h> + #include <cmath> #endif namespace Botan_Tests { @@ -29,6 +30,7 @@ class BigInt_Unit_Tests : public Test results.push_back(test_bigint_sizes()); results.push_back(test_random_integer()); + results.push_back(test_encode()); return results; } @@ -142,6 +144,32 @@ class BigInt_Unit_Tests : public Test return result; } + + Test::Result test_encode() + { + Test::Result result("BigInt encoding functions"); + + const BigInt n1(0xffff); + const BigInt n2(1023); + + Botan::secure_vector<byte> encoded_n1 = BigInt::encode_1363(n1, 256); + Botan::secure_vector<byte> encoded_n2 = BigInt::encode_1363(n2, 256); + Botan::secure_vector<byte> expected = encoded_n1; + expected += encoded_n2; + + Botan::secure_vector<byte> 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; + } }; BOTAN_REGISTER_TEST("bigint_unit", BigInt_Unit_Tests); @@ -302,6 +330,15 @@ class BigInt_Mod_Test : public Text_Based_Test 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; } }; diff --git a/src/tests/test_block.cpp b/src/tests/test_block.cpp index 75a460bc7..0863cb891 100644 --- a/src/tests/test_block.cpp +++ b/src/tests/test_block.cpp @@ -45,6 +45,12 @@ class Block_Cipher_Tests : public Text_Based_Test result.test_gte(provider, cipher->block_size(), 8); result.test_gte(provider, cipher->parallel_bytes(), cipher->block_size() * cipher->parallelism()); + // Test to make sure clear() resets what we need it to + cipher->set_key(Test::rng().random_vec(cipher->key_spec().minimum_keylength())); + Botan::secure_vector<byte> garbage = Test::rng().random_vec(cipher->block_size()); + cipher->encrypt(garbage); + cipher->clear(); + cipher->set_key(key); std::vector<uint8_t> buf = input; diff --git a/src/tests/test_cvc.cpp b/src/tests/test_cvc.cpp deleted file mode 100644 index dc4b50ebd..000000000 --- a/src/tests/test_cvc.cpp +++ /dev/null @@ -1,611 +0,0 @@ -/* -* CVC EAC1.1 tests -* -* (C) 2008 Falko Strenzke ([email protected]) -* 2008,2015 Jack Lloyd -* -* Botan is released under the Simplified BSD License (see license.txt) -*/ - -#include "tests.h" - -#if defined(BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES) - -#include <botan/ecdsa.h> -#include <botan/x509cert.h> -#include <botan/x509self.h> -#include <botan/oids.h> -#include <botan/cvc_self.h> -#include <botan/cvc_cert.h> -#include <botan/cvc_ado.h> - -#endif - -namespace Botan_Tests { - -namespace { - -#if defined(BOTAN_HAS_CARD_VERIFIABLE_CERTIFICATES) - -using namespace Botan; - -// helper functions -void helper_write_file(EAC_Signed_Object const& to_write, const std::string& file_path) - { - std::vector<byte> sv = to_write.BER_encode(); - std::ofstream cert_file(file_path, std::ios::binary); - cert_file.write((char*)sv.data(), sv.size()); - cert_file.close(); - } - -bool helper_files_equal(const std::string& file_path1, const std::string& file_path2) - { - std::ifstream cert_1_in(file_path1); - std::ifstream cert_2_in(file_path2); - std::vector<byte> sv1; - std::vector<byte> sv2; - if (!cert_1_in || !cert_2_in) - { - return false; - } - while (!cert_1_in.eof()) - { - char now; - cert_1_in.read(&now, 1); - sv1.push_back(now); - } - while (!cert_2_in.eof()) - { - char now; - cert_2_in.read(&now, 1); - sv2.push_back(now); - } - if (sv1.size() == 0) - { - return false; - } - return sv1 == sv2; - } - -Test::Result test_cvc_times() - { - Test::Result result("CVC"); - - auto time1 = Botan::EAC_Time("2008-02-01"); - auto time2 = Botan::EAC_Time("2008/02/28"); - auto time3 = Botan::EAC_Time("2004-06-14"); - - result.confirm("time1 set", time1.time_is_set()); - result.confirm("time2 set", time2.time_is_set()); - result.confirm("time3 set", time3.time_is_set()); - - result.test_eq("time1 readable_string", time1.readable_string(), "2008/02/01"); - result.test_eq("time2 readable_string", time2.readable_string(), "2008/02/28"); - result.test_eq("time3 readable_string", time3.readable_string(), "2004/06/14"); - - result.test_eq("not set", Botan::EAC_Time("").time_is_set(), false); - - const std::vector<std::string> invalid = { - " ", - "2008`02-01", - "9999-02-01", - "2000-02-01 17", - "999921" - }; - - for(auto&& v : invalid) - { - result.test_throws("invalid time " + v, [v]() { Botan::EAC_Time w(v); }); - } - - return result; - } - -Test::Result test_enc_gen_selfsigned() - { - Test::Result result("CVC"); - - EAC1_1_CVC_Options opts; - //opts.cpi = 0; - opts.chr = ASN1_Chr("my_opt_chr"); // not used - opts.car = ASN1_Car("my_opt_car"); - opts.cex = ASN1_Cex("2010 08 13"); - opts.ced = ASN1_Ced("2010 07 27"); - opts.holder_auth_templ = 0xC1; - opts.hash_alg = "SHA-256"; - - // creating a non sense selfsigned cert w/o dom pars - EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); - ECDSA_PrivateKey key(Test::rng(), dom_pars); - key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - EAC1_1_CVC cert = CVC_EAC::create_self_signed_cert(key, opts, Test::rng()); - - std::vector<byte> der(cert.BER_encode()); - std::ofstream cert_file; - cert_file.open(Test::data_file("ecc/my_cv_cert.ber"), std::ios::binary); - cert_file.write((char*)der.data(), der.size()); - cert_file.close(); - - EAC1_1_CVC cert_in(Test::data_file("ecc/my_cv_cert.ber")); - result.confirm("reloaded cert matches", cert_in == cert); - - // encoding it again while it has no dp - std::vector<byte> der2(cert_in.BER_encode()); - std::ofstream cert_file2(Test::data_file("ecc/my_cv_cert2.ber"), std::ios::binary); - cert_file2.write((char*)der2.data(), der2.size()); - cert_file2.close(); - - // read both and compare them - std::ifstream cert_1_in(Test::data_file("ecc/my_cv_cert.ber")); - std::ifstream cert_2_in(Test::data_file("ecc/my_cv_cert2.ber")); - std::vector<byte> sv1; - std::vector<byte> sv2; - if (!cert_1_in || cert_2_in) - { - result.test_failure("Unable to reread cert files"); - } - while (!cert_1_in.eof()) - { - char now; - cert_1_in.read(&now, 1); - sv1.push_back(now); - } - while (!cert_2_in.eof()) - { - char now; - cert_2_in.read(&now, 1); - sv2.push_back(now); - } - - result.test_gte("size", sv1.size(), 10); - result.test_ne("reencoded file of cert without domain parameters is different from original", sv1, sv2); - - result.test_eq("car", cert_in.get_car().value(), "my_opt_car"); - result.test_eq("chr", cert_in.get_chr().value(), "my_opt_car"); - result.test_eq("ced", cert_in.get_ced().as_string(), "20100727"); - result.test_eq("ced", cert_in.get_ced().readable_string(), "2010/07/27"); - - try - { - ASN1_Ced invalid("1999 01 01"); - result.test_failure("Allowed creation of invalid 1999 ASN1_Ced"); - } - catch(...) {} - - try - { - ASN1_Ced("2100 01 01"); - result.test_failure("Allowed creation of invalid 2100 ASN1_Ced"); - } - catch(...) {} - - std::unique_ptr<Public_Key> p_pk(cert_in.subject_public_key()); - ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast<ECDSA_PublicKey*>(p_pk.get()); - - // let's see if encoding is truely implicitca, because this is what the key should have - // been set to when decoding (see above)(because it has no domain params): - - result.confirm("implicit CA", p_ecdsa_pk->domain_format() == EC_DOMPAR_ENC_IMPLICITCA); - - try - { - const BigInt order = p_ecdsa_pk->domain().get_order(); - result.test_failure("Expected accessing domain to fail"); - } - catch (Invalid_State) {} - { - } - - // set them and try again - //cert_in.set_domain_parameters(dom_pars); - std::unique_ptr<Public_Key> p_pk2(cert_in.subject_public_key()); - ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast<ECDSA_PublicKey*>(p_pk2.get()); - //p_ecdsa_pk2->set_domain_parameters(dom_pars); - result.test_eq("order", p_ecdsa_pk2->domain().get_order(), dom_pars.get_order()); - result.confirm("verified signature", cert_in.check_signature(*p_pk2)); - - return result; - } - -Test::Result test_enc_gen_req() - { - Test::Result result("CVC"); - - EAC1_1_CVC_Options opts; - - //opts.cpi = 0; - opts.chr = ASN1_Chr("my_opt_chr"); - opts.hash_alg = "SHA-160"; - - // creating a non sense selfsigned cert w/o dom pars - EC_Group dom_pars(OID("1.3.132.0.8")); - ECDSA_PrivateKey key(Test::rng(), dom_pars); - key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - EAC1_1_Req req = CVC_EAC::create_cvc_req(key, opts.chr, opts.hash_alg, Test::rng()); - std::vector<byte> der(req.BER_encode()); - std::ofstream req_file(Test::data_file("ecc/my_cv_req.ber"), std::ios::binary); - req_file.write((char*)der.data(), der.size()); - req_file.close(); - - // read and check signature... - EAC1_1_Req req_in(Test::data_file("ecc/my_cv_req.ber")); - //req_in.set_domain_parameters(dom_pars); - std::unique_ptr<Public_Key> p_pk(req_in.subject_public_key()); - ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast<ECDSA_PublicKey*>(p_pk.get()); - //p_ecdsa_pk->set_domain_parameters(dom_pars); - result.test_eq("order", p_ecdsa_pk->domain().get_order(), dom_pars.get_order()); - result.confirm("signature valid on CVC request", req_in.check_signature(*p_pk)); - - return result; - } - -Test::Result test_cvc_req_ext() - { - EAC1_1_Req req_in(Test::data_file("ecc/DE1_flen_chars_cvcRequest_ECDSA.der")); - EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" - //req_in.set_domain_parameters(dom_pars); - std::unique_ptr<Public_Key> p_pk(req_in.subject_public_key()); - ECDSA_PublicKey* p_ecdsa_pk = dynamic_cast<ECDSA_PublicKey*>(p_pk.get()); - - Test::Result result("CVC"); - result.test_eq("order", p_ecdsa_pk->domain().get_order(), dom_pars.get_order()); - result.confirm("signature valid on CVC request", req_in.check_signature(*p_pk)); - return result; - } - -Test::Result test_cvc_ado_creation() - { - Test::Result result("CVC"); - - EAC1_1_CVC_Options opts; - //opts.cpi = 0; - opts.chr = ASN1_Chr("my_opt_chr"); - opts.hash_alg = "SHA-256"; - - // creating a non sense selfsigned cert w/o dom pars - EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); - ECDSA_PrivateKey req_key(Test::rng(), dom_pars); - req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); - EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, Test::rng()); - std::vector<byte> der(req.BER_encode()); - std::ofstream req_file(Test::data_file("ecc/my_cv_req.ber"), std::ios::binary); - req_file.write((char*)der.data(), der.size()); - req_file.close(); - - // create an ado with that req - ECDSA_PrivateKey ado_key(Test::rng(), dom_pars); - EAC1_1_CVC_Options ado_opts; - ado_opts.car = ASN1_Car("my_ado_car"); - ado_opts.hash_alg = "SHA-256"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request - - //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); - EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, Test::rng()); - result.confirm("ADO signature verifies", ado.check_signature(ado_key)); - - std::ofstream ado_file(Test::data_file("ecc/ado"), std::ios::binary); - std::vector<byte> ado_der(ado.BER_encode()); - ado_file.write((char*)ado_der.data(), ado_der.size()); - ado_file.close(); - // read it again and check the signature - EAC1_1_ADO ado2(Test::data_file("ecc/ado")); - result.confirm("ADOs match", ado == ado2); - - result.confirm("ADO signature valid", ado2.check_signature(ado_key)); - - return result; - } - -Test::Result test_cvc_ado_comparison() - { - Test::Result result("CVC"); - - EAC1_1_CVC_Options opts; - //opts.cpi = 0; - opts.chr = ASN1_Chr("my_opt_chr"); - opts.hash_alg = "SHA-224"; - - // creating a non sense selfsigned cert w/o dom pars - EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.11")); - ECDSA_PrivateKey req_key(Test::rng(), dom_pars); - req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - //EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts); - EAC1_1_Req req = CVC_EAC::create_cvc_req(req_key, opts.chr, opts.hash_alg, Test::rng()); - - - // create an ado with that req - ECDSA_PrivateKey ado_key(Test::rng(), dom_pars); - EAC1_1_CVC_Options ado_opts; - ado_opts.car = ASN1_Car("my_ado_car1"); - ado_opts.hash_alg = "SHA-224"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request - //EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts); - EAC1_1_ADO ado = CVC_EAC::create_ado_req(ado_key, req, ado_opts.car, Test::rng()); - result.confirm("ADO signature valid", ado.check_signature(ado_key)); - // make a second one for comparison - EAC1_1_CVC_Options opts2; - //opts2.cpi = 0; - opts2.chr = ASN1_Chr("my_opt_chr"); - opts2.hash_alg = "SHA-160"; // this is the only difference - ECDSA_PrivateKey req_key2(Test::rng(), dom_pars); - req_key.set_parameter_encoding(EC_DOMPAR_ENC_IMPLICITCA); - //EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2, Test::rng()); - EAC1_1_Req req2 = CVC_EAC::create_cvc_req(req_key2, opts2.chr, opts2.hash_alg, Test::rng()); - ECDSA_PrivateKey ado_key2(Test::rng(), dom_pars); - EAC1_1_CVC_Options ado_opts2; - ado_opts2.car = ASN1_Car("my_ado_car1"); - ado_opts2.hash_alg = "SHA-160"; // must be equal to req's hash alg, because ado takes his sig_algo from it's request - - EAC1_1_ADO ado2 = CVC_EAC::create_ado_req(ado_key2, req2, ado_opts2.car, Test::rng()); - result.confirm("ADO signature after creation", ado2.check_signature(ado_key2)); - - result.confirm("ADOs should not be equal", ado != ado2); - // std::ofstream ado_file(Test::data_file("ecc/ado")); - // std::vector<byte> ado_der(ado.BER_encode()); - // ado_file.write((char*)ado_der.data(), ado_der.size()); - // ado_file.close(); - // read it again and check the signature - - // EAC1_1_ADO ado2(Test::data_file("ecc/ado")); - // ECDSA_PublicKey* p_ado_pk = dynamic_cast<ECDSA_PublicKey*>(&ado_key); - // //bool ver = ado2.check_signature(*p_ado_pk); - // bool ver = ado2.check_signature(ado_key); - // CHECK_MESSAGE(ver, "failure of ado verification after reloading"); - - return result; - } - -void confirm_cex_time(Test::Result& result, - const ASN1_Cex& cex, - size_t exp_year, - size_t exp_month) - { - result.test_eq("year", cex.get_year(), exp_year); - result.test_eq("month", cex.get_month(), exp_month); - } - -Test::Result test_eac_time() - { - Test::Result result("CVC"); - - EAC_Time sooner("", ASN1_Tag(99)); - sooner.set_to("2007 12 12"); - EAC_Time later("2007 12 13"); - - result.confirm("sooner < later", sooner < later); - result.confirm("self-equal", sooner == sooner); - - ASN1_Cex my_cex("2007 08 01"); - my_cex.add_months(12); - confirm_cex_time(result, my_cex, 2008, 8); - - my_cex.add_months(4); - confirm_cex_time(result, my_cex, 2008, 12); - - my_cex.add_months(4); - confirm_cex_time(result, my_cex, 2009, 4); - - my_cex.add_months(41); - confirm_cex_time(result, my_cex, 2012, 9); - - return result; - } - -Test::Result test_ver_cvca() - { - Test::Result result("CVC"); - - EAC1_1_CVC cvc(Test::data_file("ecc/cvca01.cv.crt")); - - std::unique_ptr<Public_Key> p_pk2(cvc.subject_public_key()); - result.confirm("verified CVCA cert", cvc.check_signature(*p_pk2)); - - try - { - ECDSA_PublicKey* p_ecdsa_pk2 = dynamic_cast<ECDSA_PublicKey*>(p_pk2.get()); - p_ecdsa_pk2->domain().get_order(); - result.test_failure("Expected failure"); - } - catch(Invalid_State) - { - result.test_note("Accessing order failed"); - } - - return result; - } - -Test::Result test_copy_and_assignment() - { - Test::Result result("CVC"); - - EAC1_1_CVC cert_in(Test::data_file("ecc/cvca01.cv.crt")); - EAC1_1_CVC cert_cp(cert_in); - EAC1_1_CVC cert_ass = cert_in; - - result.confirm("same cert", cert_in == cert_cp); - result.confirm("same cert", cert_in == cert_ass); - - EAC1_1_ADO ado_in(Test::data_file("ecc/ado.cvcreq")); - EAC1_1_ADO ado_cp(ado_in); - EAC1_1_ADO ado_ass = ado_in; - result.confirm("same", ado_in == ado_cp); - result.confirm("same", ado_in == ado_ass); - - EAC1_1_Req req_in(Test::data_file("ecc/DE1_flen_chars_cvcRequest_ECDSA.der")); - EAC1_1_Req req_cp(req_in); - EAC1_1_Req req_ass = req_in; - result.confirm("same", req_in == req_cp); - result.confirm("same", req_in == req_ass); - - return result; - } - -Test::Result test_eac_str_illegal_values() - { - Test::Result result("CVC"); - - try - { - EAC1_1_CVC(Test::data_file("ecc/cvca_illegal_chars.cv.crt")); - result.test_failure("Accepted invalid EAC 1.1 CVC"); - } - catch (Decoding_Error) {} - - try - { - EAC1_1_CVC(Test::data_file("ecc/cvca_illegal_chars2.cv.crt")); - result.test_failure("Accepted invalid EAC 1.1 CVC #2"); - } - catch (Decoding_Error) {} - - return result; - } - -Test::Result test_tmp_eac_str_enc() - { - Test::Result result("CVC"); - try - { - ASN1_Car("abc!+-µ\n"); - result.test_failure("Accepted invalid EAC string"); - } - catch(Invalid_Argument) {} - - return result; - } - -Test::Result test_cvc_chain() - { - Test::Result result("CVC"); - - EC_Group dom_pars(OID("1.3.36.3.3.2.8.1.1.5")); // "german curve" - ECDSA_PrivateKey cvca_privk(Test::rng(), dom_pars); - std::string hash("SHA-224"); - ASN1_Car car("DECVCA00001"); - EAC1_1_CVC cvca_cert = DE_EAC::create_cvca(cvca_privk, hash, car, true, true, 12, Test::rng()); - std::ofstream cvca_file(Test::data_file("ecc/cvc_chain_cvca.cer"), std::ios::binary); - std::vector<byte> cvca_sv = cvca_cert.BER_encode(); - cvca_file.write((char*)cvca_sv.data(), cvca_sv.size()); - cvca_file.close(); - - ECDSA_PrivateKey cvca_privk2(Test::rng(), dom_pars); - ASN1_Car car2("DECVCA00002"); - EAC1_1_CVC cvca_cert2 = DE_EAC::create_cvca(cvca_privk2, hash, car2, true, true, 12, Test::rng()); - EAC1_1_CVC link12 = DE_EAC::link_cvca(cvca_cert, cvca_privk, cvca_cert2, Test::rng()); - std::vector<byte> link12_sv = link12.BER_encode(); - std::ofstream link12_file(Test::data_file("ecc/cvc_chain_link12.cer"), std::ios::binary); - link12_file.write((char*)link12_sv.data(), link12_sv.size()); - link12_file.close(); - - // verify the link - result.confirm("signature valid", link12.check_signature(cvca_privk)); - EAC1_1_CVC link12_reloaded(Test::data_file("ecc/cvc_chain_link12.cer")); - EAC1_1_CVC cvca1_reloaded(Test::data_file("ecc/cvc_chain_cvca.cer")); - std::unique_ptr<Public_Key> cvca1_rel_pk(cvca1_reloaded.subject_public_key()); - result.confirm("signature valid", link12_reloaded.check_signature(*cvca1_rel_pk)); - - // create first round dvca-req - ECDSA_PrivateKey dvca_priv_key(Test::rng(), dom_pars); - EAC1_1_Req dvca_req = DE_EAC::create_cvc_req(dvca_priv_key, ASN1_Chr("DEDVCAEPASS"), hash, Test::rng()); - std::ofstream dvca_file(Test::data_file("ecc/cvc_chain_dvca_req.cer"), std::ios::binary); - std::vector<byte> dvca_sv = dvca_req.BER_encode(); - dvca_file.write((char*)dvca_sv.data(), dvca_sv.size()); - dvca_file.close(); - - // sign the dvca_request - EAC1_1_CVC dvca_cert1 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req, 1, 5, true, 3, 1, Test::rng()); - result.test_eq("DVCA car", dvca_cert1.get_car().iso_8859(), "DECVCA00001"); - result.test_eq("DVCA chr", dvca_cert1.get_chr().iso_8859(), "DEDVCAEPASS00001"); - helper_write_file(dvca_cert1, Test::data_file("ecc/cvc_chain_dvca_cert1.cer")); - - // make a second round dvca ado request - ECDSA_PrivateKey dvca_priv_key2(Test::rng(), dom_pars); - EAC1_1_Req dvca_req2 = DE_EAC::create_cvc_req(dvca_priv_key2, ASN1_Chr("DEDVCAEPASS"), hash, Test::rng()); - std::ofstream dvca_file2(Test::data_file("ecc/cvc_chain_dvca_req2.cer"), std::ios::binary); - std::vector<byte> dvca_sv2 = dvca_req2.BER_encode(); - dvca_file2.write((char*)dvca_sv2.data(), dvca_sv2.size()); - dvca_file2.close(); - EAC1_1_ADO dvca_ado2 = CVC_EAC::create_ado_req(dvca_priv_key, dvca_req2, - ASN1_Car(dvca_cert1.get_chr().iso_8859()), Test::rng()); - helper_write_file(dvca_ado2, Test::data_file("ecc/cvc_chain_dvca_ado2.cer")); - - // verify the ado and sign the request too - - std::unique_ptr<Public_Key> ap_pk(dvca_cert1.subject_public_key()); - ECDSA_PublicKey* cert_pk = dynamic_cast<ECDSA_PublicKey*>(ap_pk.get()); - - //cert_pk->set_domain_parameters(dom_pars); - EAC1_1_CVC dvca_cert1_reread(Test::data_file("ecc/cvc_chain_cvca.cer")); - result.confirm("signature valid", dvca_ado2.check_signature(*cert_pk)); - result.confirm("signature valid", dvca_ado2.check_signature(dvca_priv_key)); // must also work - - EAC1_1_Req dvca_req2b = dvca_ado2.get_request(); - helper_write_file(dvca_req2b, Test::data_file("ecc/cvc_chain_dvca_req2b.cer")); - result.confirm("files match", helper_files_equal(Test::data_file("ecc/cvc_chain_dvca_req2b.cer"), Test::data_file("ecc/cvc_chain_dvca_req2.cer"))); - EAC1_1_CVC dvca_cert2 = DE_EAC::sign_request(cvca_cert, cvca_privk, dvca_req2b, 2, 5, true, 3, 1, Test::rng()); - result.test_eq("DVCA car", dvca_cert2.get_car().iso_8859(), "DECVCA00001"); - result.test_eq("DVCA chr", dvca_cert2.get_chr().iso_8859(), "DEDVCAEPASS00002"); - - // make a first round IS request - ECDSA_PrivateKey is_priv_key(Test::rng(), dom_pars); - EAC1_1_Req is_req = DE_EAC::create_cvc_req(is_priv_key, ASN1_Chr("DEIS"), hash, Test::rng()); - helper_write_file(is_req, Test::data_file("ecc/cvc_chain_is_req.cer")); - - // sign the IS request - //dvca_cert1.set_domain_parameters(dom_pars); - EAC1_1_CVC is_cert1 = DE_EAC::sign_request(dvca_cert1, dvca_priv_key, is_req, 1, 5, true, 3, 1, Test::rng()); - result.test_eq("EAC 1.1 CVC car", is_cert1.get_car().iso_8859(), "DEDVCAEPASS00001"); - result.test_eq("EAC 1.1 CVC chr", is_cert1.get_chr().iso_8859(), "DEIS00001"); - helper_write_file(is_cert1, Test::data_file("ecc/cvc_chain_is_cert.cer")); - - // verify the signature of the certificate - result.confirm("valid signature", is_cert1.check_signature(dvca_priv_key)); - - return result; - } - -class CVC_Unit_Tests : public Test - { - public: - std::vector<Test::Result> run() override - { - std::vector<Test::Result> results; - - std::vector<std::function<Test::Result()>> fns = { - test_cvc_times, - test_enc_gen_selfsigned, - test_enc_gen_req, - test_cvc_req_ext, - test_cvc_ado_creation, - test_cvc_ado_comparison, - test_eac_time, - test_ver_cvca, - test_copy_and_assignment, - test_eac_str_illegal_values, - test_tmp_eac_str_enc, - test_cvc_chain - }; - - 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("CVC test " + std::to_string(i), e.what())); - } - } - - return results; - } - - }; - -BOTAN_REGISTER_TEST("cvc", CVC_Unit_Tests); - -#endif - -} - -} diff --git a/src/tests/test_dh.cpp b/src/tests/test_dh.cpp index 4414d2c75..e82ce522a 100644 --- a/src/tests/test_dh.cpp +++ b/src/tests/test_dh.cpp @@ -52,8 +52,41 @@ class Diffie_Hellman_KAT_Tests : public PK_Key_Agreement_Test Botan::DH_PublicKey key(grp, y); return key.public_value(); } + + std::vector<Test::Result> run_final_tests() override + { + using namespace Botan; + + Test::Result result("DH negative tests"); + + const BigInt g("2"); + const BigInt p("58458002095536094658683755258523362961421200751439456159756164191494576279467"); + const DL_Group grp(p, g); + + const Botan::BigInt x("46205663093589612668746163860870963912226379131190812163519349848291472898748"); + std::unique_ptr<Private_Key> privkey(new DH_PrivateKey(Test::rng(), grp, x)); + + std::unique_ptr<PK_Key_Agreement> kas(new PK_Key_Agreement(*privkey, "Raw")); + + result.test_throws("agreement input too big", [&kas]() + { + const BigInt too_big("584580020955360946586837552585233629614212007514394561597561641914945762794672"); + kas->derive_key(16, BigInt::encode(too_big)); + }); + + result.test_throws("agreement input too small", [&kas]() + { + const BigInt too_small("1"); + kas->derive_key(16, BigInt::encode(too_small)); + }); + + return{result}; + } + }; +BOTAN_REGISTER_TEST("dh_kat", Diffie_Hellman_KAT_Tests); + class Diffie_Hellman_Keygen_Tests : public PK_Key_Generation_Test { public: @@ -69,7 +102,6 @@ class Diffie_Hellman_Keygen_Tests : public PK_Key_Generation_Test }; -BOTAN_REGISTER_TEST("dh_kat", Diffie_Hellman_KAT_Tests); BOTAN_REGISTER_TEST("dh_keygen", Diffie_Hellman_Keygen_Tests); #endif diff --git a/src/tests/test_dlies.cpp b/src/tests/test_dlies.cpp index ba8142dcb..2aa9b9b70 100644 --- a/src/tests/test_dlies.cpp +++ b/src/tests/test_dlies.cpp @@ -1,5 +1,6 @@ /* * (C) 2014,2015 Jack Lloyd +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -24,48 +25,65 @@ class DLIES_KAT_Tests : public Text_Based_Test public: DLIES_KAT_Tests() : Text_Based_Test( "pubkey/dlies.vec", - {"P", "G", "X1", "X2", "Msg", "Ciphertext"}) + {"Kdf", "Mac", "MacKeyLen", "IV", "Group", "X1", "X2", "Msg", "Ciphertext"}) {} - Test::Result run_one_test(const std::string&, const VarMap& vars) override + Test::Result run_one_test(const std::string& cipher_algo, 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 x1 = get_req_bn(vars, "X1"); const Botan::BigInt x2 = get_req_bn(vars, "X2"); const std::vector<uint8_t> input = get_req_bin(vars, "Msg"); const std::vector<uint8_t> expected = get_req_bin(vars, "Ciphertext"); - Botan::DL_Group domain(p, g); + 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"); - Botan::DH_PrivateKey from(Test::rng(), domain, x1); - Botan::DH_PrivateKey to(Test::rng(), domain, x2); + const std::vector<uint8_t> iv = get_opt_bin(vars, "IV"); - const std::string kdf_algo = "KDF2(SHA-1)"; - const std::string mac_algo = "HMAC(SHA-1)"; - const size_t mac_key_len = 16; - - Test::Result result("DLIES"); + Test::Result result("DLIES " + cipher_algo); std::unique_ptr<Botan::KDF> kdf(Botan::KDF::create(kdf_algo)); - std::unique_ptr<Botan::MAC> mac(Botan::MAC::create(mac_algo)); + if(!kdf) + { + result.test_note("Skipping due to missing KDF: " + kdf_algo); + return result; + } - if(!kdf || !mac) + std::unique_ptr<Botan::MAC> mac(Botan::MAC::create(mac_algo)); + if(!mac) { - result.test_note("Skipping due to missing KDF or MAC algo"); + result.test_note("Skipping due to missing MAC: " + mac_algo); return result; } - Botan::DLIES_Encryptor encryptor(from, - kdf->clone(), - mac->clone(), - mac_key_len); + std::unique_ptr<Botan::Cipher_Mode> enc; + std::unique_ptr<Botan::Cipher_Mode> 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)); + + 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, kdf->clone(), enc.release(), cipher_key_len, mac->clone(), mac_key_len); + Botan::DLIES_Decryptor decryptor(to, kdf.release(), dec.release(), cipher_key_len, mac.release(), mac_key_len); - Botan::DLIES_Decryptor decryptor(to, - kdf.release(), - 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()); @@ -80,6 +98,101 @@ class DLIES_KAT_Tests : public Text_Based_Test BOTAN_REGISTER_TEST("dlies", DLIES_KAT_Tests); +Test::Result test_xor() + { + Test::Result result("DLIES XOR"); + + std::vector<std::string> kdfs = { "KDF2(SHA-512)", "KDF1-18033(SHA-512)" }; + std::vector<std::string> macs = { "HMAC(SHA-512)", "CMAC(AES-128)" }; + + const size_t mac_key_len = 16; + + std::unique_ptr<Botan::KDF> kdf; + std::unique_ptr<Botan::MAC> 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, kdf->clone(), mac->clone(), mac_key_len); + + // negative test: other pub key not set + Botan::secure_vector<byte> 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<byte> ciphertext = encryptor.encrypt(plaintext, Test::rng()); + + Botan::DLIES_Decryptor decryptor(bob, kdf->clone(), mac->clone(), mac_key_len); + + // negative test: ciphertext too short + result.test_throws("ciphertext too short", [ &decryptor ]() + { + decryptor.decrypt(std::vector<byte>(2)); + }); + + result.test_eq("decryption", decryptor.decrypt(ciphertext), plaintext); + + check_invalid_ciphertexts(result, decryptor, unlock(plaintext), ciphertext); + } + } + + return result; + } + +class DLIES_Unit_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> 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 } diff --git a/src/tests/test_dsa.cpp b/src/tests/test_dsa.cpp index f9444412d..f481ae34c 100644 --- a/src/tests/test_dsa.cpp +++ b/src/tests/test_dsa.cpp @@ -22,8 +22,13 @@ class DSA_KAT_Tests : public PK_Signature_Generation_Test public: DSA_KAT_Tests() : PK_Signature_Generation_Test( "DSA", - "pubkey/dsa.vec", +#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; } diff --git a/src/tests/test_ecdh.cpp b/src/tests/test_ecdh.cpp index a6a77fabf..1ab2c4801 100644 --- a/src/tests/test_ecdh.cpp +++ b/src/tests/test_ecdh.cpp @@ -51,7 +51,7 @@ class ECDH_Keygen_Tests : public PK_Key_Generation_Test std::vector<std::string> keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1", - "brainpool256r1", "brainpool384r1", "brainpool512r1" }; + "brainpool256r1", "brainpool384r1", "brainpool512r1", "frp256v1" }; } std::unique_ptr<Botan::Private_Key> make_key(Botan::RandomNumberGenerator& rng, diff --git a/src/tests/test_ecdsa.cpp b/src/tests/test_ecdsa.cpp index 7140dcbe7..be56c315e 100644 --- a/src/tests/test_ecdsa.cpp +++ b/src/tests/test_ecdsa.cpp @@ -6,6 +6,8 @@ #include "tests.h" +#include "test_rng.h" + #if defined(BOTAN_HAS_ECDSA) #include "test_pubkey.h" #include <botan/ecdsa.h> @@ -23,8 +25,13 @@ class ECDSA_Signature_KAT_Tests : public PK_Signature_Generation_Test public: ECDSA_Signature_KAT_Tests() : PK_Signature_Generation_Test( "ECDSA", - "pubkey/ecdsa.vec", +#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; } @@ -43,12 +50,21 @@ class ECDSA_Signature_KAT_Tests : public PK_Signature_Generation_Test { return "EMSA1(" + get_req_str(vars, "Hash") + ")"; } + +#if !defined(BOTAN_HAS_RFC6979) + Botan::RandomNumberGenerator* test_rng(const std::vector<uint8_t>& 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 : public PK_Key_Generation_Test { public: - std::vector<std::string> keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1" }; } + std::vector<std::string> keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1", "frp256v1" }; } std::unique_ptr<Botan::Private_Key> make_key(Botan::RandomNumberGenerator& rng, const std::string& param) const override diff --git a/src/tests/test_ecies.cpp b/src/tests/test_ecies.cpp new file mode 100644 index 000000000..dea9b6266 --- /dev/null +++ b/src/tests/test_ecies.cpp @@ -0,0 +1,463 @@ +/* +* (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 "test_pubkey.h" + #include <botan/ecies.h> + #include <botan/ecdh.h> + #include <botan/auto_rng.h> +#endif + +namespace Botan_Tests { + +namespace { + +#if defined(BOTAN_HAS_ECIES) + +using byte = Botan::byte; +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<byte>& plaintext, const std::vector<byte>& ciphertext) + { + Botan::ECIES_Encryptor ecies_enc(private_key, ecies_params); + ecies_enc.set_other_key(other_private_key.public_point()); + Botan::ECIES_Decryptor ecies_dec(other_private_key, ecies_params); + 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<byte> encrypted = ecies_enc.encrypt(plaintext, Test::rng()); + if(!ciphertext.empty()) + { + result.test_eq("encrypted data", encrypted, ciphertext); + } + const Botan::secure_vector<byte> decrypted = ecies_dec.decrypt(encrypted); + result.test_eq("decrypted data equals plaintext", decrypted, plaintext); + + std::vector<byte> invalid_encrypted = encrypted; + byte& 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<byte> plaintext { 1, 2, 3 }; + check_encrypt_decrypt(result, private_key, other_private_key, ecies_params, std::vector<byte>(iv_length, 0), "", + plaintext, std::vector<byte>()); + } + +#if defined(BOTAN_HAS_KDF1_18033) + +class ECIES_ISO_Tests : 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<byte> c0 = get_req_bin(vars, "C0"); // expected encoded (ephemeral) public key + const std::vector<byte> 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<byte> 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); + 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(int i_cofactor_mode = 0; i_cofactor_mode < 2; ++i_cofactor_mode) + { + for(int i_single_hash_mode = 0; i_single_hash_mode < 2; ++i_single_hash_mode) + { + for(int i_old_cofactor_mode = 0; i_old_cofactor_mode < 2; ++i_old_cofactor_mode) + { + for(int i_check_mode = 0; i_check_mode < 2; ++i_check_mode) + { + for(int i_compression_type = 0; i_compression_type < 3; ++i_compression_type) + { + const bool cofactor_mode = i_cofactor_mode != 0; + const bool single_hash_mode = i_single_hash_mode != 0; + const bool old_cofactor_mode = i_old_cofactor_mode != 0; + const bool check_mode = i_check_mode != 0; + const Botan::PointGFp::Compression_Type gen_compression_type = + static_cast<Botan::PointGFp::Compression_Type>(i_compression_type); + + Flags flags = ecies_flags(cofactor_mode, old_cofactor_mode, check_mode, single_hash_mode); + + if(cofactor_mode + check_mode + old_cofactor_mode > 1) + { + result.test_throws("throw on invalid ECIES_Flags", [&] + { + Botan::ECIES_System_Params(eph_private_key.domain(), "KDF2(SHA-1)", "AES-256/CBC", + 32, "HMAC(SHA-1)", 20, gen_compression_type, flags); + }); + continue; + } + + Botan::ECIES_System_Params ecies_params(eph_private_key.domain(), "KDF2(SHA-1)", "AES-256/CBC", + 32, "HMAC(SHA-1)", 20, gen_compression_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 : 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<byte> 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<byte> plaintext = get_req_bin(vars, "Plaintext"); + const std::vector<byte> 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); + + result.test_throws("encrypt not possible without setting other public key", [ &ecies_enc ]() + { + ecies_enc.encrypt(std::vector<byte>(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); + + result.test_throws("kdf not found", [ &ecies_enc ]() + { + ecies_enc.encrypt(std::vector<byte>(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); + + result.test_throws("mac not found", [ &ecies_enc ]() + { + ecies_enc.encrypt(std::vector<byte>(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); + + result.test_throws("cipher not found", [ &ecies_enc ]() + { + ecies_enc.encrypt(std::vector<byte>(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<byte> plaintext = Botan::hex_decode("000102030405060708090A0B0C0D0E0F"); + + // generated with botan + const std::vector<byte> 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); + + result.test_throws("ciphertext too short", [ &ecies_dec ]() + { + ecies_dec.decrypt(Botan::hex_decode("0401519EAA0489FF9D51E98E4C22349A")); + }); + + return result; + } + +class ECIES_Unit_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> 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 + +} + +} diff --git a/src/tests/test_eckcdsa.cpp b/src/tests/test_eckcdsa.cpp new file mode 100644 index 000000000..96c28383a --- /dev/null +++ b/src/tests/test_eckcdsa.cpp @@ -0,0 +1,77 @@ +/* +* (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 <botan/eckcdsa.h> + #include <botan/oids.h> +#endif + +namespace Botan_Tests { + +namespace { + +#if defined(BOTAN_HAS_ECKCDSA) + +class ECKCDSA_Signature_KAT_Tests : 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<Botan::Private_Key> 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<Botan::Private_Key> 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<uint8_t>& 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 : public PK_Key_Generation_Test + { + public: + std::vector<std::string> keygen_params() const override { return { "secp256r1", "secp384r1", "secp521r1" }; } + + std::unique_ptr<Botan::Private_Key> make_key(Botan::RandomNumberGenerator& rng, + const std::string& param) const override + { + Botan::EC_Group group(param); + return std::unique_ptr<Botan::Private_Key>(new Botan::ECKCDSA_PrivateKey(rng, group)); + } + }; + +BOTAN_REGISTER_TEST("eckcdsa", ECKCDSA_Signature_KAT_Tests); +BOTAN_REGISTER_TEST("eckcdsa_keygen", ECKCDSA_Keygen_Tests); + +#endif + +} + +} diff --git a/src/tests/test_entropy.cpp b/src/tests/test_entropy.cpp index 42d2cf536..136ce6721 100644 --- a/src/tests/test_entropy.cpp +++ b/src/tests/test_entropy.cpp @@ -5,6 +5,7 @@ */ #include "tests.h" +#include "test_rng.h" #include <botan/entropy_src.h> #if defined(BOTAN_HAS_COMPRESSION) @@ -20,10 +21,6 @@ class Entropy_Source_Tests : public Test public: std::vector<Test::Result> run() override { - static const size_t MAX_ENTROPY = 512; - static const size_t MAX_SAMPLES = 256; - static const size_t MAX_ENTROPY_BYTES = 256*1024; - Botan::Entropy_Sources& srcs = Botan::Entropy_Sources::global_sources(); std::vector<std::string> src_names = srcs.enabled_sources(); @@ -39,31 +36,21 @@ class Entropy_Source_Tests : public Test try { std::vector<uint8_t> entropy; - size_t samples = 0; double entropy_estimate = 0.0; - Botan::Entropy_Accumulator accum( - [&](const uint8_t buf[], size_t buf_len, double buf_entropy) -> bool { - entropy.insert(entropy.end(), buf, buf + buf_len); - entropy_estimate += buf_entropy; - ++samples; - - result.test_note("sample " + std::to_string(samples) + " " + - Botan::hex_encode(buf, buf_len) + " " + std::to_string(buf_entropy)); + SeedCapturing_RNG rng; - result.test_gte("impossible entropy", buf_len * 8, buf_entropy); + size_t bits = srcs.poll_just(rng, src_name); - return (entropy_estimate > MAX_ENTROPY || - samples > MAX_SAMPLES || - entropy.size() > MAX_ENTROPY_BYTES); - }); + result.test_gte("Entropy estimate", rng.seed_material().size() * 8, bits); - result.confirm("polled source", srcs.poll_just(accum, src_name)); + 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("saw " + std::to_string(samples) + - " samples with total estimated entropy " + - std::to_string(entropy_estimate)); - result.test_note("poll result", entropy); + result.test_note("poll result", rng.seed_material()); #if defined(BOTAN_HAS_COMPRESSION) if(!entropy.empty()) @@ -100,23 +87,17 @@ class Entropy_Source_Tests : public Test result.test_failure(comp_algo + " exception while compressing", e.what()); } - std::vector<uint8_t> entropy2; - size_t entropy_estimate2 = 0; - Botan::Entropy_Accumulator accum2( - [&](const uint8_t buf[], size_t buf_len, size_t buf_entropy) -> bool { - entropy2.insert(entropy2.end(), buf, buf + buf_len); - entropy_estimate2 += buf_entropy; - return entropy2.size() >= entropy.size(); - }); + SeedCapturing_RNG rng2; + + size_t bits2 = srcs.poll_just(rng2, src_name); - result.confirm("polled source", srcs.poll_just(accum2, src_name)); - result.test_note("poll 2 result", entropy2); + result.test_note("poll 2 result", rng2.seed_material()); try { Botan::secure_vector<byte> compressed; - compressed.insert(compressed.end(), entropy.begin(), entropy.end()); - compressed.insert(compressed.end(), entropy2.begin(), entropy2.end()); + 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); @@ -129,7 +110,7 @@ class Entropy_Source_Tests : public Test size_t comp_diff = comp2_size - comp1_size; result.test_gte(comp_algo + " diff compressed entropy better than advertised", - comp_diff*8, entropy_estimate2); + comp_diff*8, bits2); } catch(std::exception& e) { diff --git a/src/tests/test_ffi.cpp b/src/tests/test_ffi.cpp index d055d093d..d48111683 100644 --- a/src/tests/test_ffi.cpp +++ b/src/tests/test_ffi.cpp @@ -205,7 +205,9 @@ class FFI_Unit_Tests : public Test kdf_secret.data(), kdf_secret.size(), kdf_salt.data(), - kdf_salt.size()))) + kdf_salt.size(), + nullptr, + 0))) { result.test_eq("KDF output", outbuf, "3A5DC9AA1C872B4744515AC2702D6396FC2A"); } @@ -404,13 +406,38 @@ class FFI_Unit_Tests : public Test TEST_FFI_OK(botan_pubkey_export, (pub, pubkey.data(), &pubkey_len, BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); // export private key + std::vector<uint8_t> privkey; size_t privkey_len = 0; + + /* + * botan_privkey_export is bogus for several reasons. first it hardcodes a 300 msec + * pbkdf, instead of taking that as an argument. secondly, calling it twice not only + * returns different results (due to the encryption) but they may have different sizes, + * if the number of PBKDF iterations that is used in the two runs differs greatly, and + * ends up encoding as fewer bytes in the variable length ASN.1 encoding used in PKCS #8 + * private key encryption. + * + * here request the size but then add 10 bytes. this is an attempt to avoid occasional + * cases on CI where the above case occurs, and the build fails because on the second + * call, more space was required than the first call had returned. + */ + const size_t privkey_size_slop = 10; + + // 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)); - std::vector<uint8_t> privkey(privkey_len); + privkey.resize(privkey_len + privkey_size_slop); + 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_lt("Reasonable size", 64, privkey.size()); + + // 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); @@ -420,9 +447,10 @@ class FFI_Unit_Tests : public Test privkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export_encrypted, (priv, nullptr, &privkey_len, rng, "password", "", BOTAN_PRIVKEY_EXPORT_FLAG_DER)); - privkey.resize(privkey_len); - TEST_FFI_OK(botan_privkey_export_encrypted, (priv, privkey.data(), &privkey_len, rng, "password", "", BOTAN_PRIVKEY_EXPORT_FLAG_DER)); + privkey.resize(privkey_len + privkey_size_slop); + privkey_len = privkey.size(); + TEST_FFI_OK(botan_privkey_export_encrypted, (priv, privkey.data(), &privkey_len, rng, "password", "", BOTAN_PRIVKEY_EXPORT_FLAG_DER)); privkey_len = 0; TEST_FFI_RC(BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE, botan_privkey_export_encrypted, (priv, nullptr, &privkey_len, rng, "password", "", BOTAN_PRIVKEY_EXPORT_FLAG_PEM)); @@ -640,6 +668,7 @@ class FFI_Unit_Tests : public Test Test::Result result("FFI"); 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; @@ -681,6 +710,10 @@ class FFI_Unit_Tests : public Test 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; } diff --git a/src/tests/test_hash.cpp b/src/tests/test_hash.cpp index be7156411..811e95727 100644 --- a/src/tests/test_hash.cpp +++ b/src/tests/test_hash.cpp @@ -8,6 +8,10 @@ #include <botan/hash.h> +#if defined (BOTAN_HAS_PARALLEL_HASH) + #include <botan/par_hash.h> +#endif + namespace Botan_Tests { namespace { @@ -28,7 +32,7 @@ class Hash_Function_Tests : public Text_Based_Test if(providers.empty()) { - result.note_missing("block cipher " + algo); + result.note_missing("hash " + algo); return result; } @@ -71,6 +75,97 @@ class Hash_Function_Tests : public Text_Based_Test BOTAN_REGISTER_TEST("hash", Hash_Function_Tests); +#if defined(BOTAN_HAS_PARALLEL_HASH) + +Test::Result test_clone() + { + Test::Result result("Parallel hash"); + + std::string algo = "Parallel(MD5,SHA-160)"; + std::unique_ptr<Botan::HashFunction> hash(Botan::HashFunction::create(algo)); + + if(!hash) + { + result.note_missing(algo); + return result; + } + + hash->update(""); + result.test_eq("Parallel hashing", hash->final(), "D41D8CD98F00B204E9800998ECF8427EDA39A3EE5E" + "6B4B0D3255BFEF95601890AFD80709"); + + std::unique_ptr<Botan::HashFunction> hash_clone(hash->clone()); + + hash_clone->clear(); + hash_clone->update(""); + result.test_eq("Parallel hashing (clone)", hash_clone->final(), "D41D8CD98F00B204E9800998ECF8427" + "EDA39A3EE5E6B4B0D3255BFEF95601890AFD80709"); + + return result; + } + +Test::Result test_ctor() + { + Test::Result result("Parallel hash"); + + std::unique_ptr<Botan::HashFunction> sha256(Botan::HashFunction::create("SHA-256")); + if(!sha256) + { + result.note_missing("SHA-256"); + return result; + } + + std::unique_ptr<Botan::HashFunction> sha512(Botan::HashFunction::create("SHA-512")); + if(!sha512) + { + result.note_missing("SHA-512"); + return result; + } + + std::vector<Botan::HashFunction*> hashes = { sha256.get(), sha512.get() }; + Botan::Parallel par_hash(hashes); + + par_hash.update(""); + result.test_eq("Parallel hashing", par_hash.final(), "E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B" + "934CA495991B7852B855CF83E1357EEFB8BDF1542850D66D8007D620E4050B5715DC83F4A921D36CE9C" + "E47D0D13C5D85F2B0FF8318D2877EEC2F63B931BD47417A81A538327AF927DA3E"); + + return result; + } + +class Parallel_Hash_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> fns = + { + test_clone, + test_ctor + }; + + 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("Parallel hash tests " + std::to_string(i), e.what())); + } + } + + return results; + } + }; + +BOTAN_REGISTER_TEST("par_hash", Parallel_Hash_Tests); + +#endif + } } diff --git a/src/tests/test_kdf.cpp b/src/tests/test_kdf.cpp index c11edd817..2dbb7e677 100644 --- a/src/tests/test_kdf.cpp +++ b/src/tests/test_kdf.cpp @@ -19,7 +19,7 @@ class KDF_KAT_Tests : public Text_Based_Test { public: KDF_KAT_Tests() : Text_Based_Test("kdf", - {"OutputLen", "Salt", "Secret", "Output"}, + {"OutputLen", "Salt", "Secret", "Label", "Output"}, {"IKM","XTS"}) {} @@ -38,9 +38,10 @@ class KDF_KAT_Tests : public Text_Based_Test const size_t outlen = get_req_sz(vars, "OutputLen"); const std::vector<uint8_t> salt = get_opt_bin(vars, "Salt"); const std::vector<uint8_t> secret = get_req_bin(vars, "Secret"); + const std::vector<uint8_t> label = get_opt_bin(vars, "Label"); const std::vector<uint8_t> expected = get_req_bin(vars, "Output"); - result.test_eq("derived key", kdf->derive_key(outlen, secret, salt), expected); + result.test_eq("derived key", kdf->derive_key(outlen, secret, salt, label), expected); return result; } diff --git a/src/tests/test_mac.cpp b/src/tests/test_mac.cpp index 8bc58e0e1..c7efb7f08 100644 --- a/src/tests/test_mac.cpp +++ b/src/tests/test_mac.cpp @@ -51,11 +51,21 @@ class Message_Auth_Tests : public Text_Based_Test result.test_eq(provider, mac->name(), algo); mac->set_key(key); - 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->update( "some discarded input"); + mac->clear(); + + // do the same to test verify_mac() + mac->set_key(key); + mac->update(input); + + result.test_eq(provider + " correct mac", mac->verify_mac(expected.data(), expected.size()), true); + if(input.size() > 2) { mac->set_key(key); // Poly1305 requires the re-key @@ -64,6 +74,14 @@ class Message_Auth_Tests : public Text_Based_Test 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->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); } } diff --git a/src/tests/test_mceliece.cpp b/src/tests/test_mceliece.cpp index 455c50a8d..5e3501b3e 100644 --- a/src/tests/test_mceliece.cpp +++ b/src/tests/test_mceliece.cpp @@ -67,9 +67,8 @@ class McEliece_Keygen_Encrypt_Test : public Text_Based_Test const size_t keygen_n = get_req_sz(vars, "KeyN"); const size_t keygen_t = get_req_sz(vars, "KeyT"); - Botan::HMAC_DRBG rng("HMAC(SHA-384)"); - - rng.add_entropy(keygen_seed.data(), keygen_seed.size()); + 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); Test::Result result("McEliece keygen"); @@ -78,7 +77,7 @@ class McEliece_Keygen_Encrypt_Test : public Text_Based_Test result.test_eq("private key fingerprint", hash_bytes(mce_priv.pkcs8_private_key()), fprint_priv); rng.clear(); - rng.add_entropy(encrypt_seed.data(), encrypt_seed.size()); + rng.initialize_with(encrypt_seed.data(), encrypt_seed.size()); try { @@ -131,26 +130,21 @@ class McEliece_Tests : public Test std::vector<Test::Result> run() override { - size_t params__n__t_min_max[] = { - 256, 5, 15, - 512, 5, 33, - 1024, 15, 35, - 2048, 33, 50, - 2960, 50, 56, - 6624, 110, 115 - }; + 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<Test::Result> results; - for(size_t i = 0; i < sizeof(params__n__t_min_max)/sizeof(params__n__t_min_max[0]); i+=3) + for(size_t i = 0; i < sizeof(param_sets)/sizeof(param_sets[0]); ++i) { - const size_t code_length = params__n__t_min_max[i]; - const size_t min_t = params__n__t_min_max[i+1]; - const size_t max_t = params__n__t_min_max[i+2]; - - for(size_t t = min_t; t <= max_t; ++t) + for(size_t t = param_sets[i].t_min; t <= param_sets[i].t_max; ++t) { - Botan::McEliece_PrivateKey sk1(Test::rng(), code_length, t); + Botan::McEliece_PrivateKey sk1(Test::rng(), param_sets[i].code_length, t); const Botan::McEliece_PublicKey& pk1 = sk1; const std::vector<byte> pk_enc = pk1.x509_subject_public_key(); diff --git a/src/tests/test_modes.cpp b/src/tests/test_modes.cpp index 7b6344975..66f537346 100644 --- a/src/tests/test_modes.cpp +++ b/src/tests/test_modes.cpp @@ -39,6 +39,8 @@ class Cipher_Mode_Tests : public Text_Based_Test return result; } + result.test_eq("name", enc->name(), algo); + result.test_eq("mode not authenticated", enc->authenticated(), false); enc->set_key(key); @@ -57,6 +59,9 @@ class Cipher_Mode_Tests : public Text_Based_Test dec->finish(buf); result.test_eq("decrypt", buf, input); + enc->clear(); + dec->clear(); + return result; } }; diff --git a/src/tests/test_octetstring.cpp b/src/tests/test_octetstring.cpp new file mode 100644 index 000000000..ff689518e --- /dev/null +++ b/src/tests/test_octetstring.cpp @@ -0,0 +1,168 @@ +/* +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity +* +* Botan is released under the Simplified BSD License (see license.txt) +*/ + +#include "tests.h" + +#include <botan/symkey.h> + +namespace Botan_Tests { + +namespace { + +using Botan::OctetString; + +Test::Result test_from_rng() + { + Test::Result result("OctetString"); + + 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"); + + 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); + 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"); + + OctetString os("FFFFFFFFFFFFFFFF"); + os.set_odd_parity(); + OctetString expected("FEFEFEFEFEFEFEFE"); + result.test_eq("odd parity set correctly", os, expected); + + OctetString os2("EFCBDA4FAA997F63"); + os2.set_odd_parity(); + OctetString expected2("EFCBDA4FAB987F62"); + result.test_eq("odd parity set correctly", os2, expected2); + + return result; + } + +Test::Result test_as_string() + { + Test::Result result("OctetString"); + + 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"); + + OctetString os1("0000000000000000"); + OctetString os2("FFFFFFFFFFFFFFFF"); + + 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); + + OctetString os3("0123456789ABCDEF"); + xor_result = os3 ^ os2; + 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"); + + OctetString os1("0000000000000000"); + OctetString os2("FFFFFFFFFFFFFFFF"); + + result.confirm("OctetString equality operations works as expected", os1 == os1); + result.confirm("OctetString equality operations works as expected", os2 == os2); + result.confirm("OctetString equality operations works as expected", os1 != os2); + + return result; + } + +Test::Result test_append() + { + Test::Result result("OctetString"); + + OctetString os1("0000"); + OctetString os2("FFFF"); + OctetString expected("0000FFFF"); + + OctetString append_result = os1 + os2; + + result.test_eq("OctetString append operations works as expected", append_result, expected); + + return result; + } + +class OctetString_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> 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); + +} + +} diff --git a/src/tests/test_oid.cpp b/src/tests/test_oid.cpp new file mode 100644 index 000000000..087fdc64f --- /dev/null +++ b/src/tests/test_oid.cpp @@ -0,0 +1,115 @@ +/* +* (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_OID_LOOKUP) + #include <botan/oids.h> +#endif + +namespace Botan_Tests { + +namespace { + +#if defined(BOTAN_HAS_OID_LOOKUP) + +Test::Result test_add_have_OID() + { + Test::Result result("OID add"); + + result.test_eq("there is no OID 'botan-test-oid1'", Botan::OIDS::have_oid("botan-test-oid1"), false); + + Botan::OIDS::add_oid(Botan::OID("1.2.345.6.666"), "botan-test-oid1"); + + result.test_eq("OID 'botan-test-oid1' added successfully", Botan::OIDS::have_oid("botan-test-oid1"), true); + + result.test_eq("name of OID '1.2.345.6.666' is 'botan-test-oid1'", Botan::OIDS::name_of(Botan::OID("1.2.345.6.666"), + "botan-test-oid1"), true); + + return result; + } + +Test::Result test_add_have_OID_str() + { + Test::Result result("OID add string"); + + result.test_eq("there is no OID 'botan-test-oid2'", Botan::OIDS::have_oid("botan-test-oid2"), false); + + Botan::OIDS::add_oidstr("1.2.345.6.777", "botan-test-oid2"); + + result.test_eq("OID 'botan-test-oid2' added successfully", Botan::OIDS::have_oid("botan-test-oid2"), true); + + result.test_eq("name of OID '1.2.345.6.777' is 'botan-test-oid2'", Botan::OIDS::name_of(Botan::OID("1.2.345.6.777"), + "botan-test-oid2"), true); + return result; + } + +Test::Result test_add_and_lookup() + { + Test::Result result("OID add and lookup"); + + result.test_eq("OIDS::lookup returns empty string for non-existent OID object", + Botan::OIDS::lookup(Botan::OID("1.2.345.6.888")), std::string()); + + result.test_throws("OIDS::lookup thows for non-existent OID name", []() + { + Botan::OIDS::lookup("botan-test-oid3"); + }); + + // add oid -> string mapping + Botan::OIDS::add_oid2str(Botan::OID("1.2.345.6.888"), "botan-test-oid3"); + result.test_eq("", Botan::OIDS::lookup(Botan::OID("1.2.345.6.888")), "botan-test-oid3"); + + // still throws + result.test_throws("OIDS::lookup still throws without adding name mapping", []() + { + Botan::OIDS::lookup("botan-test-oid3"); + }); + + // add string -> oid mapping + Botan::OIDS::add_str2oid(Botan::OID("1.2.345.6.888"), "botan-test-oid3"); + Botan::OIDS::lookup("botan-test-oid3"); + + return result; + } + +class OID_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> fns = + { + test_add_have_OID, + test_add_have_OID_str, + test_add_and_lookup, + }; + + 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("OID tests " + std::to_string(i), e.what())); + } + } + + return results; + } + }; + +BOTAN_REGISTER_TEST("oid", OID_Tests); + +#endif + +} + +} diff --git a/src/tests/test_pad.cpp b/src/tests/test_pad.cpp new file mode 100644 index 000000000..43ac3dfb5 --- /dev/null +++ b/src/tests/test_pad.cpp @@ -0,0 +1,59 @@ +/* +* (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 <botan/mode_pad.h> +#endif + +namespace Botan_Tests { + +#if defined(BOTAN_HAS_CIPHER_MODE_PADDING) + +class Cipher_Mode_Padding_Tests : public Text_Based_Test + { + public: + Cipher_Mode_Padding_Tests() : + Text_Based_Test("pad.vec", {"In", "Out", "Blocksize"}) + {} + + Test::Result run_one_test(const std::string& algo, const VarMap& vars) override + { + const std::vector<uint8_t> input = get_req_bin(vars, "In"); + const std::vector<uint8_t> expected = get_req_bin(vars, "Out"); + const size_t block_size = get_req_sz(vars, "Blocksize"); + + Test::Result result(algo); + + std::unique_ptr<Botan::BlockCipherModePaddingMethod> pad(Botan::get_bc_pad(algo)); + + if(!pad) + { + result.test_failure("Invalid padding method: " + algo); + return result; + } + + Botan::secure_vector<uint8_t> 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-padding", Cipher_Mode_Padding_Tests); + +#endif + +} diff --git a/src/tests/test_pkcs11.cpp b/src/tests/test_pkcs11.cpp new file mode 100644 index 000000000..85110cabf --- /dev/null +++ b/src/tests/test_pkcs11.cpp @@ -0,0 +1,47 @@ +/* +* (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) + +using namespace Botan; +using namespace PKCS11; + +std::vector<Test::Result> PKCS11_Test::run_pkcs11_tests(const std::string& name, + std::vector<std::function<Test::Result()>>& fns) + { + std::vector<Test::Result> results; + + 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(name + " 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(name + " test " + std::to_string(i), e.what())); + } + } + + return results; + } + +#endif + +} diff --git a/src/tests/test_pkcs11.h b/src/tests/test_pkcs11.h new file mode 100644 index 000000000..8606612d3 --- /dev/null +++ b/src/tests/test_pkcs11.h @@ -0,0 +1,50 @@ +/* +* (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 <botan/p11.h> +#endif + +#include <botan/secmem.h> + +#include <string> +#include <vector> +#include <functional> + +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<Test::Result> run_pkcs11_tests(const std::string& name, + std::vector<std::function<Test::Result()>>& fns); + }; + +#endif +} + +#endif diff --git a/src/tests/test_pkcs11_high_level.cpp b/src/tests/test_pkcs11_high_level.cpp new file mode 100644 index 000000000..e8c19224e --- /dev/null +++ b/src/tests/test_pkcs11_high_level.cpp @@ -0,0 +1,1522 @@ +/* +* (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 <string> +#include <vector> +#include <functional> +#include <memory> +#include <array> +#include <type_traits> +#include <map> +#include <numeric> + +#if defined(BOTAN_HAS_PKCS11) + #include <botan/p11.h> + #include <botan/p11_slot.h> + #include <botan/p11_session.h> + #include <botan/p11_module.h> + #include <botan/p11_object.h> + #include <botan/p11_randomgenerator.h> +#endif + +#if defined(BOTAN_HAS_ASN1) + #include <botan/der_enc.h> +#endif + +#if defined (BOTAN_HAS_PUBLIC_KEY_CRYPTO) + #include <botan/pubkey.h> +#endif + +#if defined(BOTAN_HAS_RSA) && defined(BOTAN_HAS_PKCS11) + #include <botan/rsa.h> + #include <botan/p11_rsa.h> +#endif + +#if defined(BOTAN_HAS_ECC_PUBLIC_KEY_CRYPTO) && defined(BOTAN_HAS_PKCS11) + #include <botan/ecc_key.h> + #include <botan/ecdsa.h> + #include <botan/ecdh.h> + #include <botan/p11_ecc_key.h> + #include <botan/p11_ecdh.h> + #include <botan/p11_ecdsa.h> +#endif + +#if defined(BOTAN_HAS_X509_CERTIFICATES) && defined(BOTAN_HAS_PKCS11) + #include <botan/p11_x509.h> +#endif + +#if defined(BOTAN_HAS_AUTO_SEEDING_RNG) + #include <botan/auto_rng.h> +#endif + +#if defined(BOTAN_HAS_HMAC_DRBG) + #include <botan/hmac_drbg.h> +#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<SlotId> 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 Module& module() const { return *m_module; } + inline Slot& slot() const { return *m_slot; } + inline Session& session() const { return *m_session; } + + private: + std::unique_ptr<Module> m_module = nullptr; + std::unique_ptr<Slot> m_slot = nullptr; + std::unique_ptr<Session> 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 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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<SlotId> 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<SlotId> 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<SlotId> 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; + } + +Test::Result test_get_token_info() + { + Test::Result result("Slot get_token_info"); + + Module module(Test::pkcs11_lib()); + std::vector<SlotId> 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<SlotId> slot_vec = Slot::get_available_slots(module, true); + Slot slot(module, slot_vec.at(0)); + + std::vector<MechanismType> 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<SlotId> 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> fns = + { + test_slot_get_available_slots, + test_slot_ctor, + test_get_slot_info, + 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<SlotId> 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_release() + { + Test::Result result("Session release/take ownership"); + + Module module(Test::pkcs11_lib()); + std::vector<SlotId> 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<SlotId> 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<SlotId> 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<CK_STATE>(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<CK_STATE>(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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> fns = + { + test_session_ctor, + 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<byte> 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<byte> 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<byte> 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<byte> 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<byte> 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<byte> 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<Object>(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<byte> 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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); + + // 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"); + + 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); + + RSA_PrivateKey exported = pk.export_key(); + result.test_success("RSA private key export was successful"); + result.test_eq("pkcs8 private key", pk.pkcs8_private_key(), priv_key.pkcs8_private_key()); + + 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"); + + 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<byte>& plaintext, const std::string& padding) -> void + { + Botan::PK_Encryptor_EME encryptor(keypair.first, padding, "pkcs11"); + auto encrypted = encryptor.encrypt(plaintext, Test::rng()); + + Botan::PK_Decryptor_EME decryptor(keypair.second, padding, "pkcs11"); + 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<byte> plaintext(256); + std::iota(std::begin(plaintext), std::end(plaintext), 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<byte> plaintext(256); + std::iota(std::begin(plaintext), std::end(plaintext), 0); + + auto sign_and_verify = [&keypair, &plaintext, &result](const std::string& emsa, bool multipart) -> void + { + Botan::PK_Signer signer(keypair.second, emsa, Botan::IEEE_1363, "pkcs11"); + std::vector<byte> 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, "pkcs11"); + 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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_ECC_PUBLIC_KEY_CRYPTO) + +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")); + 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.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); + + // 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); + + ECDSA_PrivateKey exported = pk.export_key(); + result.test_success("ECDSA private key export was successful"); + + 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<byte> plaintext(20, 0x01); + + auto sign_and_verify = [ &keypair, &plaintext, &result ](const std::string& emsa) -> void + { + Botan::PK_Signer signer(keypair.second, emsa, Botan::IEEE_1363, "pkcs11"); + auto signature = signer.sign_message(plaintext, Test::rng()); + + Botan::PK_Verifier token_verifier(keypair.first, emsa, Botan::IEEE_1363, "pkcs11"); + 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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); + +/***************************** 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, "Raw", "pkcs11"); + Botan::PK_Key_Agreement kb(keypair2.second, "Raw", "pkcs11"); + + 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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()); + + std::vector<byte> random(20); + rng.randomize(random.data(), random.size()); + result.test_ne("random data generated", random, std::vector<byte>(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()); + + 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<byte> 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<byte> 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<byte>(256)); + + return result; + } +#endif + +class PKCS11_RNG_Tests : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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<SlotId> 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<SlotId> 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<SlotId> 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<SlotId> 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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> 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("nist_x509/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 : public PKCS11_Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<std::function<Test::Result()>> fns = + { + test_x509_import + }; + + return run_pkcs11_tests("PKCS11 X509", fns); + } + }; + +BOTAN_REGISTER_TEST("pkcs11-x509", PKCS11_X509_Tests); + +#endif + +#endif + +} +} diff --git a/src/tests/test_pkcs11_low_level.cpp b/src/tests/test_pkcs11_low_level.cpp new file mode 100644 index 000000000..7b18f6f8b --- /dev/null +++ b/src/tests/test_pkcs11_low_level.cpp @@ -0,0 +1,852 @@ +/* +* (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 <string> +#include <vector> +#include <functional> +#include <memory> +#include <array> +#include <type_traits> +#include <map> + +#if defined(BOTAN_HAS_PKCS11) + #include <botan/p11.h> +#endif + +#if defined(BOTAN_HAS_DYNAMIC_LOADER) + #include <botan/dyn_load.h> +#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<CK_FLAGS>(Flag::OsLockingOk), nullptr }; + + m_low_level->C_Initialize(&init_args); + } + ~RAII_LowLevel() BOTAN_NOEXCEPT + { + + 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); + } + + std::vector<SlotId> get_slots(bool token_present) const + { + std::vector<SlotId> 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<SlotId> 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<byte>& 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<LowLevel> 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<bool(ReturnValue* return_value)>; + +// 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<CK_FLAGS>(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<SlotId> 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<SlotId>&, 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<SlotId> 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<SlotId> 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<SlotId> slot_vec = p11_low_level.get_slots(true); + + std::vector<MechanismType> mechanisms; + + auto binder = std::bind(static_cast< bool (LowLevel::*)(SlotId, std::vector<MechanismType>&, 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<SlotId> slot_vec = p11_low_level.get_slots(true); + + std::vector<MechanismType> 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<SlotId> 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<byte>&, const std::string&, ReturnValue*) const> + (&LowLevel::C_InitToken<secure_allocator<byte>>), *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<SlotId> 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<SlotId> 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<SlotId> 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<CK_FLAGS>(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<byte> pin_as_sec_vec(pin.begin(), pin.end()); + + auto login_secvec_binder = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, UserType, + const secure_vector<byte>&, ReturnValue*) const> + (&LowLevel::C_Login<secure_allocator<byte>>), *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<byte>&, ReturnValue*) const> + (&LowLevel::C_InitPIN<secure_allocator<byte>>), *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<byte>& old_pin, + const secure_vector<byte>& new_pin) -> PKCS11_BoundTestFunction + { + return std::bind(static_cast< bool (LowLevel::*)(SessionHandle, const secure_vector<byte>&, + const secure_vector<byte>&, ReturnValue*) const> + (&LowLevel::C_SetPIN<secure_allocator<byte>>), *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<byte>(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<byte> 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<Attribute, 4> dtemplate = + { + { + { static_cast<CK_ATTRIBUTE_TYPE>(AttributeType::Class), &object_class, sizeof(object_class) }, + { static_cast<CK_ATTRIBUTE_TYPE>(AttributeType::Token), &btrue, sizeof(btrue) }, + { static_cast<CK_ATTRIBUTE_TYPE>(AttributeType::Label), const_cast< char* >(label.c_str()), label.size() }, + { static_cast<CK_ATTRIBUTE_TYPE>(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<byte>> getter = + { + { AttributeType::Label, secure_vector<byte>() }, + { AttributeType::Value, secure_vector<byte>() } + }; + + auto bind = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, ObjectHandle, + std::map<AttributeType, secure_vector<byte>>&, ReturnValue*) const> + (&LowLevel::C_GetAttributeValue<secure_allocator<byte>>), *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<byte>> get_attribute_values(const RAII_LowLevel& p11_low_level, + SessionHandle session_handle, + ObjectHandle object_handle, const std::vector<AttributeType>& attribute_types) + { + std::map < AttributeType, std::vector<byte>> received_attributes; + + for(const auto& type : attribute_types) + { + received_attributes.emplace(type, std::vector<byte>()); + } + + 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<byte>> new_attributes = + { + { AttributeType::Label, secure_vector<byte>(new_label.begin(), new_label.end()) } + }; + + auto bind = std::bind(static_cast< bool (LowLevel::*)(SessionHandle, ObjectHandle, + std::map<AttributeType, secure_vector<byte>>&, ReturnValue*) const> + (&LowLevel::C_SetAttributeValue<secure_allocator<byte>>), *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<AttributeType> 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<AttributeType> 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 : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + + std::vector<std::function<Test::Result()>> 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 + +} +} diff --git a/src/tests/test_pubkey.cpp b/src/tests/test_pubkey.cpp index 2f6de639d..c7bd8f932 100644 --- a/src/tests/test_pubkey.cpp +++ b/src/tests/test_pubkey.cpp @@ -197,6 +197,19 @@ PK_Encryption_Decryption_Test::run_one_test(const std::string&, const VarMap& va //std::unique_ptr<Botan::Public_Key> pubkey(Botan::X509::load_key(Botan::X509::BER_encode(*privkey))); Botan::Public_Key* pubkey = privkey.get(); + // test EME::maximum_input_size() + std::unique_ptr<Botan::EME> eme(Botan::get_eme(padding)); + + if(eme) + { + size_t max_input_size = eme->maximum_input_size(1); + result.test_eq("maximum input size( 1 ) should always return 0", max_input_size, 0); + + size_t keybits = pubkey->max_input_bits(); + max_input_size = eme->maximum_input_size(keybits); + result.test_gte("maximum input size( keybits ) > 0", max_input_size, 1); + } + for(auto&& enc_provider : possible_pk_providers()) { std::unique_ptr<Botan::PK_Encryptor> encryptor; @@ -276,6 +289,7 @@ Test::Result PK_KEM_Test::run_one_test(const std::string&, const VarMap& vars) } catch(Botan::Lookup_Error&) { + result.test_note("Skipping due to missing KDF: " + kdf); return result; } @@ -369,7 +383,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K Botan::DataSource_Memory data_src(Botan::X509::PEM_encode(key)); std::unique_ptr<Botan::Public_Key> loaded(Botan::X509::load_key(data_src)); - result.test_eq("recovered public key from private", loaded.get(), true); + result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); result.test_eq("public key passes checks", loaded->check_key(Test::rng(), false), true); } @@ -383,7 +397,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K Botan::DataSource_Memory data_src(Botan::X509::BER_encode(key)); std::unique_ptr<Botan::Public_Key> loaded(Botan::X509::load_key(data_src)); - result.test_eq("recovered public key from private", loaded.get(), true); + result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); result.test_eq("public key passes checks", loaded->check_key(Test::rng(), false), true); } @@ -398,7 +412,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K std::unique_ptr<Botan::Private_Key> loaded( Botan::PKCS8::load_key(data_src, Test::rng())); - result.test_eq("recovered private key from PEM blob", loaded.get(), true); + 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()); result.test_eq("private key passes checks", loaded->check_key(Test::rng(), false), true); } @@ -412,7 +426,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K Botan::DataSource_Memory data_src(Botan::PKCS8::BER_encode(key)); std::unique_ptr<Botan::Public_Key> loaded(Botan::PKCS8::load_key(data_src, Test::rng())); - result.test_eq("recovered public key from private", loaded.get(), true); + result.confirm("recovered public key from private", loaded.get() != nullptr); result.test_eq("public key has same type", loaded->algo_name(), key.algo_name()); result.test_eq("public key passes checks", loaded->check_key(Test::rng(), false), true); } @@ -432,7 +446,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K std::unique_ptr<Botan::Private_Key> loaded( Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); - result.test_eq("recovered private key from encrypted blob", loaded.get(), true); + 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()); result.test_eq("private key passes checks", loaded->check_key(Test::rng(), false), true); } @@ -450,7 +464,7 @@ PK_Key_Generation_Test::test_key(const std::string& algo, const Botan::Private_K std::unique_ptr<Botan::Private_Key> loaded( Botan::PKCS8::load_key(data_src, Test::rng(), passphrase)); - result.test_eq("recovered private key from BER blob", loaded.get(), true); + 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()); result.test_eq("private key passes checks", loaded->check_key(Test::rng(), false), true); } diff --git a/src/tests/test_rfc6979.cpp b/src/tests/test_rfc6979.cpp index 30846c9e3..8076ae70d 100644 --- a/src/tests/test_rfc6979.cpp +++ b/src/tests/test_rfc6979.cpp @@ -11,6 +11,8 @@ #include <botan/hex.h> #endif +#include <botan/hash.h> + namespace Botan_Tests { namespace { @@ -31,13 +33,22 @@ class RFC6979_KAT_Tests : public Text_Based_Test 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("vector matches", gen.nonce_for(H+1), K); - 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; } diff --git a/src/tests/test_rng.cpp b/src/tests/test_rng.cpp index 6a9580345..920afef67 100644 --- a/src/tests/test_rng.cpp +++ b/src/tests/test_rng.cpp @@ -1,5 +1,6 @@ /* * (C) 2014,2015 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -15,65 +16,47 @@ #include <botan/x931_rng.h> #endif -namespace Botan_Tests { - -namespace { - -Botan::RandomNumberGenerator* get_rng(const std::string& algo_str, const std::vector<byte>& ikm) - { - class AllOnce_RNG : public Fixed_Output_RNG - { - public: - explicit AllOnce_RNG(const std::vector<byte>& in) : Fixed_Output_RNG(in) {} - - Botan::secure_vector<byte> random_vec(size_t) override - { - Botan::secure_vector<byte> vec(this->remaining()); - this->randomize(vec.data(), vec.size()); - return vec; - } - }; - - const std::vector<std::string> algo_name = Botan::parse_algorithm_name(algo_str); - - const std::string rng_name = algo_name[0]; - -#if defined(BOTAN_HAS_HMAC_DRBG) - if(rng_name == "HMAC_DRBG") - return new Botan::HMAC_DRBG( - Botan::MessageAuthenticationCode::create("HMAC(" + algo_name[1] + ")").release(), - new AllOnce_RNG(ikm)); +#if defined(BOTAN_HAS_ENTROPY_SOURCE) + #include <botan/entropy_src.h> #endif -#if defined(BOTAN_HAS_X931_RNG) - if(rng_name == "X9.31-RNG") - return new Botan::ANSI_X931_RNG(Botan::BlockCipher::create(algo_name[1]).release(), - new Fixed_Output_RNG(ikm)); +#if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) + #include <unistd.h> + #include <sys/wait.h> #endif - return nullptr; - } +#include <iostream> + +namespace Botan_Tests { + +namespace { #if defined(BOTAN_HAS_X931_RNG) class X931_RNG_Tests : public Text_Based_Test { public: - X931_RNG_Tests() : Text_Based_Test("x931.vec", {"IKM", "L", "Out"}) {} + X931_RNG_Tests() : Text_Based_Test("x931.vec", {"IKM", "Out"}) {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { const std::vector<uint8_t> ikm = get_req_bin(vars, "IKM"); const std::vector<uint8_t> expected = get_req_bin(vars, "Out"); - const size_t L = get_req_sz(vars, "L"); + Test::Result result("X9.31-RNG(" + algo + ")"); - Test::Result result(algo); + std::unique_ptr<Botan::BlockCipher> bc = Botan::BlockCipher::create(algo); - result.test_eq("length", L, expected.size()); + if(!bc) + { + result.note_missing("X9.31 cipher " + algo); + return result; + } - std::unique_ptr<Botan::RandomNumberGenerator> rng(get_rng(algo, ikm)); + Botan::ANSI_X931_RNG rng(bc.release(), new Fixed_Output_RNG(ikm)); - result.test_eq("rng", rng->random_vec(L), expected); + std::vector<uint8_t> output(expected.size()); + rng.randomize(output.data(), output.size()); + result.test_eq("rng", output, expected); return result; } @@ -89,7 +72,8 @@ class HMAC_DRBG_Tests : public Text_Based_Test { public: HMAC_DRBG_Tests() : Text_Based_Test("hmac_drbg.vec", - {"EntropyInput", "EntropyInputReseed", "Out"}) {} + {"EntropyInput", "EntropyInputReseed", "Out"}, + {"AdditionalInput1", "AdditionalInput2"}) {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { @@ -97,23 +81,30 @@ class HMAC_DRBG_Tests : public Text_Based_Test const std::vector<byte> reseed_input = get_req_bin(vars, "EntropyInputReseed"); const std::vector<byte> expected = get_req_bin(vars, "Out"); - Test::Result result(algo); + const std::vector<byte> ad1 = get_opt_bin(vars, "AdditionalInput1"); + const std::vector<byte> ad2 = get_opt_bin(vars, "AdditionalInput2"); + + Test::Result result("HMAC_DRBG(" + algo + ")"); - std::unique_ptr<Botan::RandomNumberGenerator> rng(get_rng(algo, seed_input)); - if(!rng) + auto mac = Botan::MessageAuthenticationCode::create("HMAC(" + algo + ")"); + if(!mac) { - result.note_missing("RNG " + algo); + result.note_missing("HMAC(" + algo + ")"); return result; } - rng->reseed(0); // force initialization + std::unique_ptr<Botan::HMAC_DRBG> 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()); - rng->random_vec(expected.size()); // discard 1st block + std::vector<byte> 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", rng->random_vec(expected.size()), expected); + result.test_eq("rng", out, expected); return result; } @@ -121,6 +112,389 @@ class HMAC_DRBG_Tests : public Text_Based_Test BOTAN_REGISTER_TEST("hmac_drbg", HMAC_DRBG_Tests); +class HMAC_DRBG_Unit_Tests : public Test + { + private: + class Broken_Entropy_Source : 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 : public Botan::Entropy_Source + { + public: + std::string name() const override { return "Insufficient Entropy Source"; } + + size_t poll(Botan::RandomNumberGenerator&) override + { + return 0; + } + }; + + class Request_Counting_RNG : public Botan::RandomNumberGenerator + { + public: + Request_Counting_RNG() : m_randomize_count(0) {}; + + bool is_seeded() const override { return true; } + + void clear() override {} + + void randomize(byte[], size_t) override + { + m_randomize_count++; + } + + void add_entropy(const byte[], size_t) override {} + + std::string name() const override { return "Request_Counting_RNG"; } + + size_t randomize_count() { return m_randomize_count; } + + private: + size_t m_randomize_count; + }; + + public: + Test::Result test_reseed_kat() + { + Test::Result result("HMAC_DRBG Reseed KAT"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + Request_Counting_RNG counting_rng; + Botan::HMAC_DRBG rng(std::move(mac), counting_rng, Botan::Entropy_Sources::global_sources(), 2); + Botan::secure_vector<Botan::byte> seed_input( + {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xAA,0xBB,0xCC,0xDD,0xEE,0xFF}); + Botan::secure_vector<Botan::byte> output_after_initialization( + {0x26,0x06,0x95,0xF4,0xB8,0x96,0x0D,0x0B,0x27,0x4E,0xA2,0x9E,0x8D,0x2B,0x5A,0x35}); + Botan::secure_vector<Botan::byte> output_without_reseed( + {0xC4,0x90,0x04,0x5B,0x35,0x4F,0x50,0x09,0x68,0x45,0xF0,0x4B,0x11,0x03,0x58,0xF0}); + result.test_eq("is_seeded",rng.is_seeded(),false); + + rng.initialize_with(seed_input.data(), seed_input.size()); + + Botan::secure_vector<Botan::byte> out(16); + + 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, output_after_initialization); + + // 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_ne("out after reseed", out, output_without_reseed); + + return result; + } + + Test::Result test_reseed() + { + Test::Result result("HMAC_DRBG Reseed"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + // test reseed_interval is enforced + Request_Counting_RNG counting_rng; + Botan::HMAC_DRBG rng(std::move(mac), 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); + + // request > max_number_of_bits_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("HMAC_DRBG Broken Entropy Input"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + // make sure no output is generated when the entropy input source is broken + + const size_t reseed_interval = 1024; + + // underlying_rng throws exception + Botan::Null_RNG broken_entropy_input_rng; + Botan::HMAC_DRBG rng_with_broken_rng(std::move(mac), broken_entropy_input_rng, reseed_interval); + + 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> broken_entropy_source_1(new Broken_Entropy_Source()); + std::unique_ptr<Broken_Entropy_Source> 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)); + + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Botan::HMAC_DRBG rng_with_broken_es(std::move(mac), broken_entropy_sources, reseed_interval); + 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> insufficient_entropy_source(new Insufficient_Entropy_Source()); + insufficient_entropy_sources.add_source(std::move(insufficient_entropy_source)); + + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Botan::HMAC_DRBG rng_with_insufficient_es(std::move(mac), insufficient_entropy_sources, reseed_interval); + 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 + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Botan::HMAC_DRBG rng_with_broken_rng_and_es(std::move(mac), broken_entropy_input_rng, + Botan::Entropy_Sources::global_sources(), reseed_interval); + result.test_throws("broken underlying rng but good entropy sources", [&rng_with_broken_rng_and_es] () + { rng_with_broken_rng_and_es.random_vec(16); }); + + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Botan::HMAC_DRBG rng_with_rng_and_broken_es(std::move(mac), Test::rng(), broken_entropy_sources, reseed_interval); + result.test_throws("good underlying rng but broken entropy sources", [&rng_with_rng_and_broken_es] () + { rng_with_rng_and_broken_es.random_vec(16); }); + + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Botan::HMAC_DRBG rng_with_broken_rng_and_broken_es(std::move(mac), broken_entropy_input_rng, broken_entropy_sources, reseed_interval); + 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("HMAC_DRBG Nonce Check"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + // make sure the nonce has at least 1/2*security_strength bits + + // SHA-256 -> 128 bits security strength + for( auto nonce_size : { 0, 4, 15, 16, 17, 32 } ) + { + if(!mac) + { + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + } + + Botan::HMAC_DRBG rng(std::move(mac)); + result.test_eq("not seeded", rng.is_seeded(), false); + std::vector<Botan::byte> nonce(nonce_size); + rng.initialize_with(nonce.data(), nonce.size()); + + if(nonce_size < 16) + { + result.test_eq("not seeded", rng.is_seeded(), false); + result.test_throws("invalid nonce size", [&rng, &nonce] () { rng.random_vec(16); }); + } + else + { + result.test_eq("is seeded", rng.is_seeded(), true); + rng.random_vec(16); + } + } + + return result; + } + + Test::Result test_prediction_resistance() + { + Test::Result result("HMAC_DRBG Prediction Resistance"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + // set reseed_interval = 1, forcing a reseed for every RNG request + Request_Counting_RNG counting_rng; + Botan::HMAC_DRBG rng(std::move(mac), 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("HMAC_DRBG Fork Safety"); + +#if defined(BOTAN_TARGET_OS_TYPE_IS_UNIX) + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + const size_t reseed_interval = 1024; + + // make sure rng is reseeded after every fork + Request_Counting_RNG counting_rng; + Botan::HMAC_DRBG rng(std::move(mac), 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<byte> 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]); + read(fd[0], &count, sizeof(count)); + close(fd[0]); + + + result.test_eq("parent not reseeded", counting_rng.randomize_count(), 1); + result.test_eq("child reseed occurred", count, 2); + + parent_bytes = rng.random_vec(16); + read(fd[0], &child_bytes[0], child_bytes.size()); + result.test_ne("parent and child output sequences differ", parent_bytes, child_bytes); + close(fd[0]); + + int status = 0; + ::waitpid(pid, &status, 0); + } + else + { + // child process, send randomize_count and first output sequence back to parent + close(fd[0]); + rng.randomize(&child_bytes[0], child_bytes.size()); + count = counting_rng.randomize_count(); + write(fd[1], &count, sizeof(count)); + rng.randomize(&child_bytes[0], child_bytes.size()); + write(fd[1], &child_bytes[0], child_bytes.size()); + close(fd[1]); + _exit(0); + } +#endif + return result; + } + + Test::Result test_randomize_with_ts_input() + { + Test::Result result("HMAC_DRBG Randomize With Timestamp Input"); + + auto mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + if(!mac) + { + result.note_missing("HMAC(SHA-256)"); + return result; + } + + const size_t reseed_interval = 1024; + const size_t request_bytes = 64; + const std::vector<uint8_t> seed(128); + + // check that randomize_with_ts_input() creates different output based on a timestamp + // and possibly additional data, such as process id + Fixed_Output_RNG fixed_output_rng1(seed); + Botan::HMAC_DRBG rng1(std::move(mac), fixed_output_rng1, reseed_interval); + Botan::secure_vector<byte> output1(request_bytes); + rng1.randomize(output1.data(), output1.size()); + + mac = Botan::MessageAuthenticationCode::create("HMAC(SHA-256)"); + Fixed_Output_RNG fixed_output_rng2(seed); + Botan::HMAC_DRBG rng2(std::move(mac), fixed_output_rng2, reseed_interval); + Botan::secure_vector<byte> output2(request_bytes); + 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; + } + + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + results.push_back(test_reseed_kat()); + results.push_back(test_reseed()); + 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()); + return results; + } + }; + +BOTAN_REGISTER_TEST("hmac_drbg_unit", HMAC_DRBG_Unit_Tests); + #endif } diff --git a/src/tests/test_rng.h b/src/tests/test_rng.h index c14ed7fb7..0379a2ee9 100644 --- a/src/tests/test_rng.h +++ b/src/tests/test_rng.h @@ -15,13 +15,6 @@ #include <botan/hex.h> #include <botan/exceptn.h> -#if defined(BOTAN_HAS_SYSTEM_RNG) - #include <botan/system_rng.h> -#else - #include <botan/auto_rng.h> -#endif - - namespace Botan_Tests { /** @@ -43,9 +36,9 @@ class Fixed_Output_RNG : public Botan::RandomNumberGenerator return out; } - size_t reseed_with_sources(Botan::Entropy_Sources&, - size_t, - std::chrono::milliseconds) override { return 0; } + size_t reseed(Botan::Entropy_Sources&, + size_t, + std::chrono::milliseconds) override { return 0; } void randomize(uint8_t out[], size_t len) override { @@ -87,7 +80,7 @@ class Fixed_Output_RNG : public Botan::RandomNumberGenerator class Fixed_Output_Position_RNG : public Fixed_Output_RNG { public: - bool is_seeded() const override { return !m_buf.empty() || m_rng->is_seeded(); } + bool is_seeded() const override { return !m_buf.empty() || Test::rng().is_seeded(); } uint8_t random() override { @@ -114,7 +107,7 @@ class Fixed_Output_Position_RNG : public Fixed_Output_RNG } else { // return random - m_rng->randomize(out,len); + Test::rng().randomize(out,len); } } @@ -127,32 +120,44 @@ class Fixed_Output_Position_RNG : public Fixed_Output_RNG explicit Fixed_Output_Position_RNG(const std::vector<uint8_t>& in, uint32_t pos) : Fixed_Output_RNG(in), - m_pos(pos), - m_rng{} + m_pos(pos) { -#if defined(BOTAN_HAS_SYSTEM_RNG) - m_rng.reset(new Botan::System_RNG); -#else - m_rng.reset(new Botan::AutoSeeded_RNG); -#endif } explicit Fixed_Output_Position_RNG(const std::string& in_str, uint32_t pos) : Fixed_Output_RNG(in_str), - m_pos(pos), - m_rng{} + m_pos(pos) { -#if defined(BOTAN_HAS_SYSTEM_RNG) - m_rng.reset(new Botan::System_RNG); -#else - m_rng.reset(new Botan::AutoSeeded_RNG); -#endif } private: uint32_t m_pos = 0; uint32_t m_requests = 0; - std::unique_ptr<RandomNumberGenerator> m_rng; + }; + +class SeedCapturing_RNG : public Botan::RandomNumberGenerator + { + public: + void randomize(uint8_t[], size_t) override + { throw Botan::Exception("SeedCapturing_RNG has no output"); } + + void add_entropy(const byte 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<uint8_t>& seed_material() const { return m_seed; } + + private: + std::vector<uint8_t> m_seed; + size_t m_samples = 0; }; } diff --git a/src/tests/test_stream.cpp b/src/tests/test_stream.cpp index 232fdcdd9..d3d83c26c 100644 --- a/src/tests/test_stream.cpp +++ b/src/tests/test_stream.cpp @@ -18,7 +18,7 @@ class Stream_Cipher_Tests : public Text_Based_Test { public: Stream_Cipher_Tests(): Text_Based_Test("stream", - {"Key", "In", "Out"}, {"Nonce"}) {} + {"Key", "In", "Out"}, {"Nonce", "Seek"}) {} Test::Result run_one_test(const std::string& algo, const VarMap& vars) override { @@ -26,6 +26,7 @@ class Stream_Cipher_Tests : public Text_Based_Test const std::vector<uint8_t> input = get_req_bin(vars, "In"); const std::vector<uint8_t> expected = get_req_bin(vars, "Out"); const std::vector<uint8_t> nonce = get_opt_bin(vars, "Nonce"); + const size_t seek = get_opt_sz(vars, "Seek", 0); Test::Result result(algo); @@ -53,6 +54,9 @@ class Stream_Cipher_Tests : public Text_Based_Test if(nonce.size()) cipher->set_iv(nonce.data(), nonce.size()); + if (seek != 0) + cipher->seek(seek); + std::vector<uint8_t> buf = input; cipher->encrypt(buf); diff --git a/src/tests/test_utils.cpp b/src/tests/test_utils.cpp index 47f740a17..3d474d605 100644 --- a/src/tests/test_utils.cpp +++ b/src/tests/test_utils.cpp @@ -1,5 +1,6 @@ /* * (C) 2015 Jack Lloyd +* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -9,6 +10,7 @@ #include <botan/loadstor.h> #include <botan/calendar.h> #include <botan/internal/rounding.h> +#include <botan/charset.h> #if defined(BOTAN_HAS_BASE64_CODEC) #include <botan/base64.h> @@ -326,6 +328,129 @@ BOTAN_REGISTER_TEST("base64", Base64_Tests); #endif +class Charset_Tests : 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 + { + using namespace Botan; + + Test::Result result("Charset"); + + const std::vector<byte> in = get_req_bin(vars, "In"); + const std::vector<byte> expected = get_req_bin(vars, "Out"); + + std::string converted; + if(type == "UTF16-LATIN1") + { + converted = Charset::transcode(std::string(in.begin(), in.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UCS2_CHARSET); + } + else if(type == "UTF8-LATIN1") + { + converted = Charset::transcode(std::string(in.begin(), in.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UTF8_CHARSET); + } + else if(type == "LATIN1-UTF8") + { + converted = Charset::transcode(std::string(in.begin(), in.end()), + Character_Set::UTF8_CHARSET, Character_Set::LATIN1_CHARSET); + } + else + { + throw Test_Error("Unexpected header '" + type + "' in charset tests"); + } + + result.test_eq("string converted successfully", std::vector<byte>(converted.begin(), converted.end()), expected); + + return result; + } + + Test::Result utf16_to_latin1_negative_tests() + { + using namespace Botan; + + Test::Result result("Charset negative tests"); + + result.test_throws("conversion fails for non-Latin1 characters", []() + { + // "abcdefŸabcdef" + std::vector<byte> 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 + }; + + Charset::transcode(std::string(input.begin(), input.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UCS2_CHARSET); + }); + + result.test_throws("conversion fails for UTF16 string with odd number of bytes", []() + { + std::vector<byte> input = { 0x00, 0x61, 0x00 }; + + Charset::transcode(std::string(input.begin(), input.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UCS2_CHARSET); + }); + + return result; + } + + Test::Result utf8_to_latin1_negative_tests() + { + using namespace Botan; + + Test::Result result("Charset negative tests"); + + result.test_throws("conversion fails for non-Latin1 characters", []() + { + // "abcdefŸabcdef" + std::vector<byte> input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC5, + 0xB8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66 + }; + + Charset::transcode(std::string(input.begin(), input.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UTF8_CHARSET); + }); + + result.test_throws("invalid utf-8 string", []() + { + // sequence truncated + std::vector<byte> input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC5 }; + + Charset::transcode(std::string(input.begin(), input.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UTF8_CHARSET); + }); + + result.test_throws("invalid utf-8 string", []() + { + std::vector<byte> input = { 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0xC8, 0xB8, 0x61 }; + + Charset::transcode(std::string(input.begin(), input.end()), + Character_Set::LATIN1_CHARSET, Character_Set::UTF8_CHARSET); + }); + + return result; + } + + std::vector<Test::Result> run_final_tests() override + { + using namespace Botan; + + 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); + } } diff --git a/src/tests/tests.cpp b/src/tests/tests.cpp index a79e05aba..a6f96144c 100644 --- a/src/tests/tests.cpp +++ b/src/tests/tests.cpp @@ -127,7 +127,7 @@ bool Test::Result::test_ne(const std::string& what, 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_failure(who() + ": " + what + " produced matching"); return test_success(); } @@ -190,6 +190,23 @@ bool Test::Result::test_eq(const std::string& what, size_t produced, size_t expe return test_is_eq(what, produced, expected); } +bool Test::Result::test_eq(const std::string& what, OctetString produced, 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) @@ -217,6 +234,18 @@ bool Test::Result::test_gte(const std::string& what, size_t produced, size_t exp return test_success(); } +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 << " prohibited 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) { @@ -254,34 +283,6 @@ 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_ok(const std::string& what, int rc) - { - if(rc != 0) - { - std::ostringstream err; - err << m_who; - err << " " << what; - err << " unexpectedly failed with error code " << rc; - return test_failure(err.str()); - } - - return test_success(); - } - -bool Test::Result::test_rc_fail(const std::string& func, const std::string& why, int rc) - { - 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::Result::test_rc(const std::string& func, int expected, int rc) { if(expected != rc) @@ -436,17 +437,20 @@ Botan::RandomNumberGenerator* Test::m_test_rng = nullptr; std::string Test::m_data_dir; size_t Test::m_soak_level = 0; bool Test::m_log_success = false; +std::string Test::m_pkcs11_lib; //static void Test::setup_tests(size_t soak, bool log_success, const std::string& data_dir, + const std::string& pkcs11_lib, Botan::RandomNumberGenerator* rng) { m_data_dir = data_dir; m_soak_level = soak; m_log_success = log_success; m_test_rng = rng; + m_pkcs11_lib = pkcs11_lib; } //static @@ -474,6 +478,12 @@ bool Test::log_success() } //static +std::string Test::pkcs11_lib() + { + return m_pkcs11_lib; + } + +//static Botan::RandomNumberGenerator& Test::rng() { if(!m_test_rng) diff --git a/src/tests/tests.h b/src/tests/tests.h index c7bed64d9..39aaf67cd 100644 --- a/src/tests/tests.h +++ b/src/tests/tests.h @@ -11,6 +11,7 @@ #include <botan/build.h> #include <botan/rng.h> #include <botan/hex.h> +#include <botan/symkey.h> #if defined(BOTAN_HAS_BIGINT) #include <botan/bigint.h> @@ -38,6 +39,8 @@ using Botan::byte; using Botan::BigInt; #endif +using Botan::OctetString; + class Test_Error : public Botan::Exception { public: @@ -175,6 +178,8 @@ class Test bool test_eq(const std::string& what, size_t produced, size_t expected); + bool test_eq(const std::string& what, OctetString produced, OctetString expected); + template<typename I1, typename I2> bool test_int_eq(I1 x, I2 y, const char* what) { @@ -184,10 +189,44 @@ class Test bool test_lt(const std::string& what, size_t produced, size_t expected); bool test_gte(const std::string& what, size_t produced, size_t expected); - bool test_rc_ok(const std::string& func, int rc); - bool test_rc_fail(const std::string& func, const std::string& why, int rc); + template<typename T> + bool test_rc_ok(const std::string& func, T rc) + { + static_assert(std::is_integral<T>::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<typename T> + bool test_rc_fail(const std::string& func, const std::string& why, T rc) + { + static_assert(std::is_integral<T>::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); + #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); @@ -301,7 +340,7 @@ class Test if(r.size() > 0) { - const size_t offset = rng.get_random<uint16_t>() % r.size(); + const size_t offset = rng.next_byte() % r.size(); r[offset] ^= rng.next_nonzero_byte(); } @@ -311,10 +350,12 @@ class Test static void setup_tests(size_t soak, bool log_succcss, const std::string& data_dir, + const std::string& pkcs11_lib, Botan::RandomNumberGenerator* rng); static size_t soak_level(); static bool log_success(); + static std::string pkcs11_lib(); static const std::string& data_dir(); @@ -327,6 +368,7 @@ class Test static Botan::RandomNumberGenerator* m_test_rng; static size_t m_soak_level; static bool m_log_success; + static std::string m_pkcs11_lib; }; /* diff --git a/src/tests/unit_ecdh.cpp b/src/tests/unit_ecdh.cpp index 0368a53d1..40a10203a 100644 --- a/src/tests/unit_ecdh.cpp +++ b/src/tests/unit_ecdh.cpp @@ -41,24 +41,30 @@ class ECDH_Unit_Tests : public Test std::vector<std::string> oids = { "1.2.840.10045.3.1.7", "1.3.132.0.8", "1.2.840.10045.3.1.1" }; - - for(auto&& oid : oids) + try { - Botan::EC_Group dom_pars(Botan::OIDS::lookup(oid)); - Botan::ECDH_PrivateKey private_a(Test::rng(), dom_pars); - Botan::ECDH_PrivateKey private_b(Test::rng(), dom_pars); + for(auto&& oid : oids) + { + Botan::EC_Group dom_pars(Botan::OIDS::lookup(oid)); + 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, "KDF2(SHA-1)"); - Botan::PK_Key_Agreement kb(private_b, "KDF2(SHA-1)"); + Botan::PK_Key_Agreement ka(private_a, "KDF2(SHA-512)"); + Botan::PK_Key_Agreement kb(private_b, "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()); + 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()); + 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&) + { + result.test_note("Skipping due to missing KFD2 or SHA-512"); + } return result; } diff --git a/src/tests/unit_ecdsa.cpp b/src/tests/unit_ecdsa.cpp index ecafb3c7f..421323fda 100644 --- a/src/tests/unit_ecdsa.cpp +++ b/src/tests/unit_ecdsa.cpp @@ -17,6 +17,7 @@ #include <botan/ec_group.h> #include <botan/oids.h> #include <botan/pkcs8.h> + #include <botan/hash.h> #endif #if defined(BOTAN_HAS_X509_CERTIFICATES) @@ -41,7 +42,6 @@ Test::Result test_hash_larger_than_n() Botan::EC_Group dom_pars(Botan::OIDS::lookup("1.3.132.0.8")); // secp160r1 // n = 0x0100000000000000000001f4c8f927aed3ca752257 (21 bytes) - // -> shouldn't work with SHA224 which outputs 28 bytes Botan::ECDSA_PrivateKey priv_key(Test::rng(), dom_pars); @@ -49,35 +49,27 @@ Test::Result test_hash_larger_than_n() for(size_t i = 0; i != message.size(); ++i) message[i] = i; - Botan::PK_Signer pk_signer_160(priv_key, "EMSA1_BSI(SHA-1)"); - Botan::PK_Verifier pk_verifier_160(priv_key, "EMSA1_BSI(SHA-1)"); + auto sha1 = Botan::HashFunction::create("SHA-1"); + auto sha224 = Botan::HashFunction::create("SHA-224"); - Botan::PK_Signer pk_signer_224(priv_key, "EMSA1_BSI(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, "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<byte> signature_160 = pk_signer_160.sign_message(message, Test::rng()); - result.test_eq("message verifies", pk_verifier_160.verify_message(message, signature_160), true); - try - { - pk_signer_224.sign_message(message, Test::rng()); - result.test_failure("bad key/hash combination not rejected"); - } - catch(Botan::Encoding_Error) - { - result.test_note("bad key/hash combination rejected"); - } - - // now check that verification alone fails - - // sign it with the normal EMSA1 + // Verify we can sign and verify with SHA-224 Botan::PK_Signer pk_signer(priv_key, "EMSA1(SHA-224)"); std::vector<byte> signature = pk_signer.sign_message(message, Test::rng()); - - Botan::PK_Verifier pk_verifier(priv_key, "EMSA1_BSI(SHA-224)"); - - result.test_eq("corrupt message does not verify", pk_verifier.verify_message(message, signature), false); + Botan::PK_Verifier pk_verifier(priv_key, "EMSA1(SHA-224)"); + result.test_eq("message verifies", pk_verifier.verify_message(message, signature), true); return result; } @@ -130,12 +122,12 @@ Test::Result test_sign_then_ver() 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, "EMSA1(SHA-1)"); + Botan::PK_Signer signer(ecdsa, "EMSA1(SHA-256)"); auto msg = Botan::hex_decode("12345678901234567890abcdef12"); std::vector<byte> sig = signer.sign_message(msg, Test::rng()); - Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-1)"); + Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-256)"); result.confirm("signature verifies", verifier.verify_message(msg, sig)); @@ -205,7 +197,7 @@ Test::Result test_ecdsa_create_save_load() 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, "EMSA1(SHA-1)"); + Botan::PK_Signer signer(key, "EMSA1(SHA-256)"); msg_signature = signer.sign_message(msg, Test::rng()); ecc_private_key_pem = Botan::PKCS8::PEM_encode(key); @@ -220,7 +212,7 @@ Test::Result test_ecdsa_create_save_load() Botan::ECDSA_PrivateKey* loaded_ec_key = dynamic_cast<Botan::ECDSA_PrivateKey*>(loaded_key.get()); result.confirm("the loaded key could be converted into an ECDSA_PrivateKey", loaded_ec_key); - Botan::PK_Verifier verifier(*loaded_ec_key, "EMSA1(SHA-1)"); + Botan::PK_Verifier verifier(*loaded_ec_key, "EMSA1(SHA-256)"); result.confirm("generated signature valid", verifier.verify_message(msg, msg_signature)); @@ -268,8 +260,8 @@ Test::Result test_read_pkcs8() Botan::ECDSA_PrivateKey* ecdsa_nodp = dynamic_cast<Botan::ECDSA_PrivateKey*>(loaded_key_nodp.get()); result.confirm("key loaded", ecdsa_nodp); - Botan::PK_Signer signer(*ecdsa_nodp, "EMSA1(SHA-1)"); - Botan::PK_Verifier verifier(*ecdsa_nodp, "EMSA1(SHA-1)"); + Botan::PK_Signer signer(*ecdsa_nodp, "EMSA1(SHA-256)"); + Botan::PK_Verifier verifier(*ecdsa_nodp, "EMSA1(SHA-256)"); std::vector<byte> signature_nodp = signer.sign_message(msg, Test::rng()); @@ -335,8 +327,8 @@ Test::Result test_curve_registry() Botan::EC_Group dom_pars(oid); Botan::ECDSA_PrivateKey ecdsa(Test::rng(), dom_pars); - Botan::PK_Signer signer(ecdsa, "EMSA1(SHA-1)"); - Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-1)"); + Botan::PK_Signer signer(ecdsa, "EMSA1(SHA-256)"); + Botan::PK_Verifier verifier(ecdsa, "EMSA1(SHA-256)"); auto msg = Botan::hex_decode("12345678901234567890abcdef12"); std::vector<byte> sig = signer.sign_message(msg, Test::rng()); diff --git a/src/tests/unit_tls.cpp b/src/tests/unit_tls.cpp index 1dbc20273..33c6c245e 100644 --- a/src/tests/unit_tls.cpp +++ b/src/tests/unit_tls.cpp @@ -1,5 +1,6 @@ /* * (C) 2014,2015 Jack Lloyd +* 2016 Matthias Gierlings * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -161,7 +162,11 @@ std::function<void (const byte[], size_t)> queue_inserter(std::vector<byte>& q) return [&](const byte buf[], size_t sz) { q.insert(q.end(), buf, buf + sz); }; } -void print_alert(Botan::TLS::Alert, const byte[], size_t) +void print_alert(Botan::TLS::Alert) + { + } + +void alert_cb_with_data(Botan::TLS::Alert, const byte[], size_t) { } @@ -219,164 +224,216 @@ Test::Result test_tls_handshake(Botan::TLS::Protocol_Version offer_version, { std::vector<byte> c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent; - Botan::TLS::Server server(queue_inserter(s2c_traffic), - queue_inserter(server_recv), - print_alert, - handshake_complete, + std::unique_ptr<Botan::TLS::Callbacks> server_cb(new Botan::TLS::Compat_Callbacks( + queue_inserter(s2c_traffic), + queue_inserter(server_recv), + std::function<void (Botan::TLS::Alert, const byte[], size_t)>(alert_cb_with_data), + handshake_complete, + nullptr, + next_protocol_chooser)); + + // TLS::Server object constructed by new constructor using virtual callback interface. + std::unique_ptr<Botan::TLS::Server> server( + new Botan::TLS::Server(*server_cb, server_sessions, creds, server_policy, rng, - next_protocol_chooser, - false); + false)); + + std::unique_ptr<Botan::TLS::Callbacks> client_cb(new Botan::TLS::Compat_Callbacks( + queue_inserter(c2s_traffic), + queue_inserter(client_recv), + std::function<void (Botan::TLS::Alert, const byte[], size_t)>(alert_cb_with_data), + handshake_complete)); - Botan::TLS::Client client(queue_inserter(c2s_traffic), - queue_inserter(client_recv), - print_alert, - handshake_complete, + // TLS::Client object constructed by new constructor using virtual callback interface. + std::unique_ptr<Botan::TLS::Client> client( + new Botan::TLS::Client(*client_cb, client_sessions, creds, client_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, - protocols_offered); + protocols_offered)); size_t rounds = 0; - while(true) + // Test TLS using both new and legacy constructors. + for(size_t ctor_sel = 0; ctor_sel < 2; ctor_sel++) { - ++rounds; - - if(rounds > 25) + if(ctor_sel == 1) { - if(r <= 2) - result.test_failure("Still here after many rounds, deadlock?"); - break; + 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)); } - if(handshake_done && (client.is_closed() || server.is_closed())) - break; - - if(client.is_active() && client_sent.empty()) + while(true) { - // Choose a len between 1 and 511 - const size_t c_len = 1 + rng.next_byte() + rng.next_byte(); - client_sent = unlock(rng.random_vec(c_len)); + ++rounds; - // TODO send in several records - client.send(client_sent); - } + if(rounds > 25) + { + if(r <= 2) + result.test_failure("Still here after many rounds, deadlock?"); + break; + } - if(server.is_active() && server_sent.empty()) - { - result.test_eq("server protocol", server.next_protocol(), "test/3"); + if(handshake_done && (client->is_closed() || server->is_closed())) + break; - const size_t s_len = 1 + rng.next_byte() + rng.next_byte(); - server_sent = unlock(rng.random_vec(s_len)); - server.send(server_sent); - } + if(client->is_active() && client_sent.empty()) + { + // Choose a len between 1 and 511 + const size_t c_len = 1 + rng.next_byte() + rng.next_byte(); + client_sent = unlock(rng.random_vec(c_len)); - const bool corrupt_client_data = (r == 3); - const bool corrupt_server_data = (r == 4); + // TODO send in several records + client->send(client_sent); + } - 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<byte> input; - std::swap(c2s_traffic, input); - - if(corrupt_server_data) + if(server->is_active() && server_sent.empty()) { - input = Test::mutate_vec(input, true); - size_t needed = server.received_data(input.data(), input.size()); + result.test_eq("server->protocol", server->next_protocol(), "test/3"); - size_t total_consumed = needed; - - while(needed > 0 && - result.test_lt("Never requesting more than max protocol len", needed, 18*1024) && - result.test_lt("Total requested is readonable", total_consumed, 128*1024)) - { - input.resize(needed); - Test::rng().randomize(input.data(), input.size()); - needed = server.received_data(input.data(), input.size()); - total_consumed += needed; - } + const size_t s_len = 1 + rng.next_byte() + rng.next_byte(); + server_sent = unlock(rng.random_vec(s_len)); + server->send(server_sent); } - else + + const bool corrupt_client_data = (r == 3); + const bool corrupt_server_data = (r == 4); + + if(c2s_traffic.size() > 0) { - size_t needed = server.received_data(input.data(), input.size()); - result.test_eq("full packet received", needed, 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<byte> input; + std::swap(c2s_traffic, input); + + if(corrupt_server_data) + { + input = Test::mutate_vec(input, true); + size_t needed = server->received_data(input.data(), input.size()); - continue; - } + size_t total_consumed = needed; - if(s2c_traffic.size() > 0) - { - std::vector<byte> input; - std::swap(s2c_traffic, input); + while(needed > 0 && + result.test_lt("Never requesting more than max protocol len", needed, 18*1024) && + result.test_lt("Total requested is readonable", total_consumed, 128*1024)) + { + input.resize(needed); + Test::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); + } - if(corrupt_client_data) + continue; + } + + if(s2c_traffic.size() > 0) { - input = Test::mutate_vec(input, true); - size_t needed = client.received_data(input.data(), input.size()); + std::vector<byte> input; + std::swap(s2c_traffic, input); + + if(corrupt_client_data) + { + input = Test::mutate_vec(input, true); + size_t needed = client->received_data(input.data(), input.size()); - size_t total_consumed = 0; + size_t total_consumed = 0; - while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) + while(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) + { + input.resize(needed); + Test::rng().randomize(input.data(), input.size()); + needed = client->received_data(input.data(), input.size()); + total_consumed += needed; + } + } + else { - input.resize(needed); - Test::rng().randomize(input.data(), input.size()); - needed = client.received_data(input.data(), input.size()); - total_consumed += needed; + size_t needed = client->received_data(input.data(), input.size()); + result.test_eq("full packet received", needed, 0); } + + continue; } - else + + if(client_recv.size()) { - size_t needed = client.received_data(input.data(), input.size()); - result.test_eq("full packet received", needed, 0); + result.test_eq("client recv", client_recv, server_sent); } - 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(server_recv.size()) + { + result.test_eq("server->recv", server_recv, client_sent); + } - if(r > 2) - { - if(client_recv.size() && server_recv.size()) + if(r > 2) { - result.test_failure("Negotiated in the face of data corruption " + std::to_string(r)); + 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(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); + 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()); + result.test_eq("TLS key material export", client_key.bits_of(), server_key.bits_of()); - if(r % 2 == 0) - client.close(); - else - server.close(); + if(r % 2 == 0) + client->close(); + else + server->close(); + } } } } @@ -453,183 +510,232 @@ Test::Result test_dtls_handshake(Botan::TLS::Protocol_Version offer_version, { std::vector<byte> c2s_traffic, s2c_traffic, client_recv, server_recv, client_sent, server_sent; - Botan::TLS::Server server(queue_inserter(s2c_traffic), - queue_inserter(server_recv), - print_alert, - handshake_complete, + std::unique_ptr<Botan::TLS::Callbacks> server_cb(new Botan::TLS::Compat_Callbacks( + queue_inserter(s2c_traffic), + queue_inserter(server_recv), + std::function<void (Botan::TLS::Alert)>(print_alert), + handshake_complete, + nullptr, + next_protocol_chooser)); + + std::unique_ptr<Botan::TLS::Callbacks> client_cb(new Botan::TLS::Compat_Callbacks( + queue_inserter(c2s_traffic), + queue_inserter(client_recv), + std::function<void (Botan::TLS::Alert)>(print_alert), + handshake_complete)); + + // TLS::Server object constructed by new constructor using virtual callback interface. + std::unique_ptr<Botan::TLS::Server> server( + new Botan::TLS::Server(*server_cb, server_sessions, creds, server_policy, rng, - next_protocol_chooser, - true); + true)); - Botan::TLS::Client client(queue_inserter(c2s_traffic), - queue_inserter(client_recv), - print_alert, - handshake_complete, + // TLS::Client object constructed by new constructor using virtual callback interface. + std::unique_ptr<Botan::TLS::Client> client( + new Botan::TLS::Client(*client_cb, client_sessions, creds, client_policy, rng, Botan::TLS::Server_Information("server.example.com"), offer_version, - protocols_offered); + protocols_offered)); size_t rounds = 0; - while(true) + // Test DTLS using both new and legacy constructors. + for(size_t ctor_sel = 0; ctor_sel < 2; ctor_sel++) { - // TODO: client and server should be in different threads - std::this_thread::sleep_for(std::chrono::milliseconds(rng.next_byte() % 2)); - ++rounds; - - if(rounds > 100) + if(ctor_sel == 1) { - result.test_failure("Still here after many rounds"); - break; + 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)); } - if(handshake_done && (client.is_closed() || server.is_closed())) - break; - - if(client.is_active() && client_sent.empty()) + while(true) { - // Choose a len between 1 and 511 and send random chunks: - const size_t c_len = 1 + rng.next_byte() + rng.next_byte(); - client_sent = unlock(rng.random_vec(c_len)); + // TODO: client and server should be in different threads + std::this_thread::sleep_for(std::chrono::milliseconds(rng.next_byte() % 2)); + ++rounds; - // TODO send multiple parts - 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); - } + if(rounds > 100) + { + result.test_failure("Still here after many rounds"); + break; + } - 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(handshake_done && (client->is_closed() || server->is_closed())) + break; - 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<byte> input; - std::swap(c2s_traffic, input); - - if(corrupt_server_data) + if(client->is_active() && client_sent.empty()) { - try - { - input = Test::mutate_vec(input, true); - size_t needed = server.received_data(input.data(), input.size()); - - if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) - { - input.resize(needed); - Test::rng().randomize(input.data(), input.size()); - needed = client.received_data(input.data(), input.size()); - } - } - catch(std::exception&) - { - result.test_note("corruption caused server exception"); - } + // 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); } - else + + if(server->is_active() && server_sent.empty()) { - 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()); - } - } + result.test_eq("server ALPN", server->next_protocol(), "test/3"); - continue; - } + const size_t s_len = 1 + rng.next_byte() + rng.next_byte(); + server_sent = unlock(rng.random_vec(s_len)); + server->send(server_sent); + } - if(s2c_traffic.size() > 0) - { - std::vector<byte> input; - std::swap(s2c_traffic, input); + 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(corrupt_client_data) + if(c2s_traffic.size() > 0) { - try + /* + * 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<byte> input; + std::swap(c2s_traffic, input); + + if(corrupt_server_data) { - input = Test::mutate_vec(input, true); - size_t needed = client.received_data(input.data(), input.size()); - - if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) + try { - input.resize(needed); - Test::rng().randomize(input.data(), input.size()); - needed = client.received_data(input.data(), input.size()); + input = Test::mutate_vec(input, true); + size_t needed = server->received_data(input.data(), input.size()); + + if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) + { + input.resize(needed); + Test::rng().randomize(input.data(), input.size()); + client->received_data(input.data(), input.size()); + } + } + catch(std::exception&) + { + result.test_note("corruption caused server exception"); } } - catch(std::exception&) + else { - result.test_note("corruption caused client exception"); + 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; } - else + + if(s2c_traffic.size() > 0) { - try + std::vector<byte> input; + std::swap(s2c_traffic, input); + + if(corrupt_client_data) { - size_t needed = client.received_data(input.data(), input.size()); - result.test_eq("full packet received", needed, 0); + try + { + input = Test::mutate_vec(input, true); + size_t needed = client->received_data(input.data(), input.size()); + + if(needed > 0 && result.test_lt("Never requesting more than max protocol len", needed, 18*1024)) + { + input.resize(needed); + Test::rng().randomize(input.data(), input.size()); + client->received_data(input.data(), input.size()); + } + } + catch(std::exception&) + { + result.test_note("corruption caused client exception"); + } } - catch(std::exception& e) + else { - result.test_failure("client error", e.what()); + 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; - } + 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 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(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(server_recv.size()) + { + result.test_eq("server recv", server_recv, client_sent); + } - if(client.is_closed() && server.is_closed()) - break; + 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); + 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()); + result.test_eq("key material export", client_key.bits_of(), server_key.bits_of()); - if(r % 2 == 0) - client.close(); - else - server.close(); + if(r % 2 == 0) + client->close(); + else + server->close(); + } } } } diff --git a/src/tests/unit_x509.cpp b/src/tests/unit_x509.cpp index 93e26eee2..4d3c63a1b 100644 --- a/src/tests/unit_x509.cpp +++ b/src/tests/unit_x509.cpp @@ -1,5 +1,6 @@ /* * (C) 2009 Jack Lloyd +* (C) 2016 René Korthaus, Rohde & Schwarz Cybersecurity * * Botan is released under the Simplified BSD License (see license.txt) */ @@ -28,6 +29,14 @@ #include <botan/ecdsa.h> #endif +#if defined(BOTAN_HAS_ECGDSA) + #include <botan/ecgdsa.h> +#endif + +#if defined(BOTAN_HAS_ECKCDSA) + #include <botan/eckcdsa.h> +#endif + #endif namespace Botan_Tests { @@ -56,7 +65,7 @@ Botan::X509_Cert_Options ca_opts() return opts; } -Botan::X509_Cert_Options req_opts1() +Botan::X509_Cert_Options req_opts1(const std::string& algo) { Botan::X509_Cert_Options opts("Test User 1/US/Botan Project/Testing"); @@ -64,6 +73,18 @@ Botan::X509_Cert_Options req_opts1() opts.dns = "botan.randombit.net"; opts.email = "[email protected]"; + opts.not_before("1601012000Z"); + opts.not_after("3001012000Z"); + + 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; } @@ -80,168 +101,186 @@ Botan::X509_Cert_Options req_opts2() return opts; } -std::unique_ptr<Botan::Private_Key> make_a_private_key() +std::unique_ptr<Botan::Private_Key> make_a_private_key(const std::string& algo) { +#if defined(BOTAN_HAS_RSA) + if(algo == "RSA") + { + return std::unique_ptr<Botan::Private_Key>(new Botan::RSA_PrivateKey(Test::rng(), 1024)); + } +#endif +#if defined(BOTAN_HAS_DSA) + if(algo == "DSA") + { + Botan::DL_Group grp("dsa/botan/2048"); + return std::unique_ptr<Botan::Private_Key>(new Botan::DSA_PrivateKey(Test::rng(), grp)); + } +#endif #if defined(BOTAN_HAS_ECDSA) - Botan::EC_Group grp("secp256r1"); - return std::unique_ptr<Botan::Private_Key>(new Botan::ECDSA_PrivateKey(Test::rng(), grp)); -#elif defined(BOTAN_HAS_RSA) - return std::unique_ptr<Botan::Private_Key>(new Botan::RSA_PrivateKey(Test::rng(), 1024)); -#elif defined(BOTAN_HAS_DSA) - Botan::DL_Group grp("dsa/botan/2048"); - return std::unique_ptr<Botan::Private_Key>(new Botan::DSA_PrivateKey(Test::rng(), grp)); -#else - return std::unique_ptr<Botan::Private_Key>(nullptr); + if(algo == "ECDSA") + { + Botan::EC_Group grp("secp256r1"); + return std::unique_ptr<Botan::Private_Key>(new Botan::ECDSA_PrivateKey(Test::rng(), grp)); + } +#endif +#if defined(BOTAN_HAS_ECGDSA) + if(algo == "ECGDSA") + { + Botan::EC_Group grp("brainpool256r1"); + return std::unique_ptr<Botan::Private_Key>(new Botan::ECGDSA_PrivateKey(Test::rng(), grp)); + } #endif +#if defined(BOTAN_HAS_ECKCDSA) + if(algo == "ECKCDSA") + { + Botan::EC_Group grp("brainpool256r1"); + return std::unique_ptr<Botan::Private_Key>(new Botan::ECKCDSA_PrivateKey(Test::rng(), grp)); + } +#endif + return std::unique_ptr<Botan::Private_Key>(nullptr); } -class X509_Cert_Unit_Tests : public Test + +Test::Result test_x509_dates() { - public: - std::vector<Test::Result> run() override; + Test::Result result("X509_Time"); + + Botan::X509_Time time; + result.confirm("unset time not set", !time.time_is_set()); + time = Botan::X509_Time("0802011822Z", 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"); + + const std::vector<std::string> valid = { + "0802010000Z", + "0802011724Z", + "0406142334Z", + "9906142334Z", + "0006142334Z", + + "080201000000Z", + "080201172412Z", + "040614233433Z", + "990614233444Z", + "000614233455Z", + }; - private: - 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("0802011822Z", 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"); - - const std::vector<std::string> valid = { - "0802010000Z", - "0802011724Z", - "0406142334Z", - "9906142334Z", - "0006142334Z", - - "080201000000Z", - "080201172412Z", - "040614233433Z", - "990614233444Z", - "000614233455Z", - }; - - // Dates that are valid per X.500 but rejected as unsupported - const std::vector<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", - }; - - const std::vector<std::string> invalid = { - "", - " ", - "2008`02-01", - "9999-02-01", - "2000-02-01 17", - "999921", - - // 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 - "0802010000", - "0802010000z" - }; - - for(auto&& v : valid) - { - Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); - } + // Dates that are valid per X.500 but rejected as unsupported + const std::vector<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", + }; - for(auto&& v : valid_but_unsup) - { - result.test_throws("valid but unsupported", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); - } + const std::vector<std::string> invalid = { + "", + " ", + "2008`02-01", + "9999-02-01", + "2000-02-01 17", + "999921", + + // 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 + "0802010000", + "0802010000z" + }; - for(auto&& v : invalid) - { - result.test_throws("invalid", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); - } + for(auto&& v : valid) + { + Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); + } - return result; - } - }; + for(auto&& v : valid_but_unsup) + { + result.test_throws("valid but unsupported", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); + } -std::vector<Test::Result> X509_Cert_Unit_Tests::run() + for(auto&& v : invalid) + { + result.test_throws("invalid", [v]() { Botan::X509_Time t(v, Botan::ASN1_Tag::UTC_TIME); }); + } + + return result; + } + +Test::Result test_x509_cert(const std::string& sig_algo, const std::string& hash_fn = "SHA-256") { - std::vector<Test::Result> results; Test::Result result("X509 Unit"); - const std::string hash_fn = "SHA-256"; - /* Create the CA's key and self-signed cert */ - std::unique_ptr<Botan::Private_Key> ca_key(make_a_private_key()); + std::unique_ptr<Botan::Private_Key> ca_key(make_a_private_key(sig_algo)); if(!ca_key) { - // Failure because X.509 enabled but no RSA or ECDSA seems off - result.test_failure("Skipping due to no enabled signature algorithms"); - results.push_back(result); - return results; + // 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(), *ca_key, hash_fn, Test::rng()); + result.test_eq("ca key usage", (ca_cert.constraints() & Botan::Key_Constraints(Botan::KEY_CERT_SIGN | Botan::CRL_SIGN)) == + Botan::Key_Constraints(Botan::KEY_CERT_SIGN | Botan::CRL_SIGN), true); + /* Create user #1's key and cert request */ - std::unique_ptr<Botan::Private_Key> user1_key(make_a_private_key()); + std::unique_ptr<Botan::Private_Key> user1_key(make_a_private_key(sig_algo)); Botan::PKCS10_Request user1_req = - Botan::X509::create_cert_req(req_opts1(), + Botan::X509::create_cert_req(req_opts1(sig_algo), *user1_key, hash_fn, Test::rng()); /* Create user #2's key and cert request */ - std::unique_ptr<Botan::Private_Key> user2_key(make_a_private_key()); + std::unique_ptr<Botan::Private_Key> user2_key(make_a_private_key(sig_algo)); Botan::PKCS10_Request user2_req = Botan::X509::create_cert_req(req_opts2(), @@ -258,15 +297,41 @@ std::vector<Test::Result> X509_Cert_Unit_Tests::run() 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)); + Botan::X509_Certificate user2_cert = + ca.sign_request(user2_req, Test::rng(), + from_date(2008, 01, 01), + from_date(2033, 01, 01)); + + result.test_eq("user1 key usage", (user1_cert.constraints() & req_opts1(sig_algo).constraints) == req_opts1(sig_algo).constraints, 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 = user1_cert; + result.test_eq("certificate assignment", user1_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)); + + result.test_eq("issuer info CN", user1_cert.issuer_info("CN").at(0), ca_opts().common_name); + result.test_eq("issuer info Country", user1_cert.issuer_info("C").at(0), ca_opts().country); + result.test_eq("issuer info Orga", user1_cert.issuer_info("O").at(0), ca_opts().organization); + result.test_eq("issuer info OrgaUnit", user1_cert.issuer_info("OU").at(0), ca_opts().org_unit); + Botan::X509_CRL crl1 = ca.new_crl(Test::rng()); /* Verify the certs */ Botan::Certificate_Store_In_Memory store; - store.add_certificate(ca_cert); + store.add_certificate(ca.ca_certificate()); Botan::Path_Validation_Restrictions restrictions(false); @@ -316,11 +381,280 @@ std::vector<Test::Result> X509_Cert_Unit_Tests::run() result_u2 = Botan::x509_path_validate(user2_cert, restrictions, store); result.test_eq("user 2 still revoked", result_u2.result_string(), revoked_str); - results.push_back(result); - results.push_back(test_x509_dates()); - return results; + 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<Botan::Private_Key> 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(), + *ca_key, + hash_fn, + Test::rng()); + + /* Create the CA object */ + Botan::X509_CA ca(ca_cert, *ca_key, hash_fn); + + std::unique_ptr<Botan::Private_Key> 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; + + Botan::PKCS10_Request user1_req = + Botan::X509::create_cert_req(opts, + *user1_key, + hash_fn, + Test::rng()); + + 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); + + Botan::PKCS10_Request mult_usage_req = + Botan::X509::create_cert_req(opts, + *user1_key, + hash_fn, + Test::rng()); + + 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; + + Botan::PKCS10_Request no_usage_req = + Botan::X509::create_cert_req(opts, + *user1_key, + hash_fn, + Test::rng()); + + 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; + } + +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(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<Botan::Private_Key> 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.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); }); + 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 == "RW" || pk_algo == "NR" || pk_algo == "DSA" || + pk_algo == "ECDSA" || pk_algo == "ECGDSA" || pk_algo == "ECKCDSA") + { + // 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; } + +class X509_Cert_Unit_Tests : public Test + { + public: + std::vector<Test::Result> run() override + { + std::vector<Test::Result> results; + const std::vector<std::string> sig_algos { "RSA", "DSA", "ECDSA", "ECGDSA", "ECKCDSA" }; + Test::Result cert_result("X509 Unit"); + Test::Result usage_result("X509 Usage"); + + for(const auto& algo : sig_algos) + { + cert_result.merge(test_x509_cert(algo)); + usage_result.merge(test_usage(algo)); + } + + results.push_back(cert_result); + results.push_back(usage_result); + + const std::vector<std::string> pk_algos { "DH", "ECDH", "RSA", "ElGamal", "RW", "NR", + "DSA", "ECDSA", "ECGDSA", "ECKCDSA" }; + Test::Result valid_constraints_result("X509 Valid Constraints"); + + for(const auto& algo : pk_algos) + { + valid_constraints_result.merge(test_valid_constraints(algo)); + } + + results.push_back(valid_constraints_result); + results.push_back(test_x509_dates()); + + return results; + } + }; + BOTAN_REGISTER_TEST("unit_x509", X509_Cert_Unit_Tests); #endif |